Jump to content

Speed Density Tuning


Recommended Posts

Part 1 Basic Speed Density tuning and LOAD calculation

In this guide we will explain the basics of Speed Density (SD) tuning and then go further into detail. The basic level (Slope tuning) is probably enough for most tuners to get their vehicles set up to a high specification.

In general if you have not really modified the vehicle heavily your speed density tables should be well set up by Ford and you may only be seeing areas outside the normal because of injector scaling being out. You should start with your injectors dialed in to a high level and they should be dialed in on a stock car where possible. Starting with factory injectors to dial the car in with the new mods will save a lot of time resolving injector scaling issues. A lot of high performance vehicles use injectors with good data supplied and tuning them often requires no changes to the Speed Density tables.  Enough of a rant, lets get into it.

Speed Density Calculations

The sample vehicle is a factory turbocharged vehicle,  therefore we will be using the Open IMRC SD tables. 

The SD systems calculates the amount of air mass entering the engine based on different sensor inputs. In a nutshell the calculation is:

        Air Mass = VE_CORRECTIONS * (MAP - MAP_0) / SLOPE


  1. Air Mass is the mass of air injected into a single cylinder (AirCharge in Ford language)
  2. MAP is the Manifold Absolute Pressure measured from the Temperature/MAP Sensor (TMAP)
  3. MAP_0 is the calculated offset for the MAP sensor 
  4. SLOPE is the calculated Slope
  5. VE_CORRECTIONS, Volumetric Efficiency corrections for the SD tables based on, but not limited to,  Coolant and Intake temperatures

The Calculated SLOPE and MAP_0 will be expanded further as we progress.

Part 1 Basic Level Tuning or Basic level SLOPE tuning 

In order to make the VE_CORRECTIONS = 1.0 we will assume Ford Standard temperatures and pressures (FSTP): Barometric pressure of 29.921 inHg, intake temperature of 100F and Coolant temperature of 200F, yes all imperial measures! We will start with just a couple of the SD tables and this will suffice for quite a high level of tuning. In fact most tuners will only tune in the slope table as this will, generally, provide enough capability and allow tuning in a time allocated to tuning a vehicle. We will also be using the BF for our example (catch code 77DA) as it has the most modifiers to the SD tables (complexity/flexibility). Lets start with the two tables we will be using to tune SD:

  1. auF0056: This is the theoretical MAP value when AirCharge is zero.
  2. auF0061:  This is the Slope of MAP per AirCharge value used in the speed density calculation

Both of these tables take as their inputs RPM (x) and Intake Cam Angle (y). Immediately you will see you should log Intake Cam Angle/RPM/MAP to do analysis. Here are the two tables fro a stock calibration:


Note the highlighted cells, we will be demonstrating the calculation for the Intake Cam angle of -10 degrees at 3000 RPM and a MAP reading of 50inHg (roughly 10psi of boost pressure). The calculation of the Air Mass will be:

    Air Mass = (50 - 2.7) / 19200 ~= 0.00246354  lb of air

This will be of more use later but lets say at this RPM point on our dyno log we were commanding a lambda of 0.8 off the base fuel table and we actually read from the dyno wideband 0.82. In order to increase the calculated Air Mass in order to get extra fuel in we will need to reduce the Slope table as it is a divisor.  You would do this by multiplying 19200 by desired lambda (0.8) / Actual (0.82) = 19200 * 0.8/0.82  ~=18732.0. You would repeat this process for each point in the rev range where the dyno wideband shows a difference between commanded lambda and actual lambda.

If your Dyno does not log Cam Angle then all is not lost. You can use the following table to determine the theoretical cam angle for a given load:


 The highlighted cells are for when the car is on full load. So lets see which cells you would be modifying on a dyno run for the slope corrections. Here are this cells you would be modifying assuming you started your run from around 1600RPM:


If you do have intake cam angle then pick the cells either side of the logged point. In the above example if the intake cam angle was logged as being 12 degrees at 5250 RPM then you would only need to alter the 10 and 20 degree cam angle points.

In order to speed up the process you can delay tuning the SD tables and tune the base fuel table like a scratch pad. Here is the Base Fuel Table:


So if our dyno runs shows variations in the commanded lambda to desired lambda or the following:


then you can easily alter the SD cells in the SD tables for the RPM points 3000 -> 4000 to get the desired result. NOTE if you see something like this:


Where B is the Wideband reading and A is the desired lambda from the Base Fuel table.

This is a good indication your injector data is not correct and you could look at dividing your high slope by about 1.07. 


LOAD is calculated from the AirMass. The Basic formula for calculating LOAD is:

     LOAD = Air Mass / auF0008 (Airmass of a cylinder as sea level)


So the LOAD from the above example with AirMass of  0.00246354 is 00246354/0.001723 or approximately 1.43

What happens to LOAD when I change the SD tables to get the commanded lambda?

Say for example we had to alter the above example and increase fuel in this region because we altered cam shafts. So instead of 19200 we ended up with a quite big change like 16600 to get the commanded lambda. The new load would be:

     Air Mass = (50 - 2.7) / 16600 ~= 0.0028494  lb of air

And the new LOAD would be

    0.0028494 / 0.001723 ~= 1.65

You will need to take this into consideration when tuning the LOAD based tables such as spark. You can simplify this by using the new load will be 19200/16600 * old load. That is 19200/16600 * 1.43 = 1.65. This is assuming you have not changed the MAP at Zero value.

It will quickly become apparent that if you are tuning the SD tables to resolve injector scaling issues you will end up with a very different load than what you expect and your timing could be substantially different to what you are expecting,.

edit: The old summary thread can be found here for some more information including the full mathematical equation behind the model.



  • Like 3
  • Thanks 1
Link to comment
Share on other sites

Part 2 Tuning Correction Speed Density tuning

The Tuning Correction (TC) is a multiplier to the SLOPE calculation outlined in Part 1. It is applied to the SLOPE calculation after all other calculations on the SLOPE are performed. We will get to the other SLOPE modifiers in Part 3.

Tuning Correction needs some explanation as the table uses RPM for the x axis and Percentage Inferred LOAD (%Load) for the Y Axis. Percentage Inferred load is  not calculate from LOAD at all but is really table that allows the throttle position to be a modifier to the load calculation. Basically %Load is calculated in the following manner:

  1. Air Load is calculated for Wide Open Throttle (WOT) = AIR_LOAD_WOT
  2. Air load is calculated for the current throttle position (TP_REL) = AIR_LOAD_TP
  3. Exhaust Gas Recirculation is subtracted from AIR_LOAD_TP  (ignore for the time being) 
  4. AIR_LOAD_TP is then "clipped" between the 0.0 and the AIR_LOAD_WT. This means that if AIR_LOAD is greater than  AIR_LOAD_WOT it will use AIR_LOAD_WOT or if it is less than 0.0 it will set AID_LOAD_TP to 0.0, otherwise it will use AIR_LOAD_TP.
  6. The result of Equation 4 means means the %load is capped at 1.0

Inferred is another was of saying that the PCM does not have the actual sensors to calculate the real value so it uses other sensors to come up with an approximation of what the value would be. In this case we are referring to LOAD based on throttle position. Here is how the two AIR_LOAD_WOT and AIR_LOAD_TP are calculated:

AIR_LOAD_WOT= auF0046(RPM,1023.0) -  ( auF1564(RPM,CAM_ANGLE) * auF11002(RPM,TP_REL) )


  1. auF0046  This table is used to determine the load when the MAF is failed (or no MAF) and the IMRC is Open.
  2. auF1564: "Compensation multiplier table for VCT actuator non-linearities"
  3. auf11002: "Aircharge subtractor at sea level for variable cam timing"


For 77DA the tables other than auF0046 will work out to be 0.1 or less (see later images of them). Basically we should work with auF0046 to calculate %Load and leave the correction as an exercise for those more curious.

At WOT the above calculation will yield a %Load of 1.0. Now assuming we cruising along at 2000 RPM with a throttle position with an A/D count of 130 ( low throttle) then using



We would get the LOAD_WOT = 1.18 and LOAD_TP_REL would be 0.68.

Therefore %Load = 0.68/1.18 = 0.57

This is probably not what you would be expecting in your normal load calculation. Hopefully this helps you determine the cells you would need to alter for the tuning correction table on part throttle.


Here are the other tables if you would like to work out the remainder of the calculation:








  • Like 3
  • Thanks 1
Link to comment
Share on other sites

Part 3 MAP_0 Calculations

If we exclude Cam Overlap (Part 4) MAP_0 calculation is quite simple:

    MAP_0 = MAP Intercept * Barometric Correction


  1. MAP Intercept is auF0056(RPM,CAM_ANGLE) * 
  2. Barometric Correction is auF0058





As can be seen by these tables the barometric pressure around see level will have little impact on the 2.7 value from the MAP Intercept At Zero AirCharge


  • Like 2
  • Thanks 1
Link to comment
Share on other sites

Part 4 CAM Overlap Corrections

Almost done, these calculations are for the more for completeness than necessary for your tuning. If you change cams in the car then you will have to look start tuning in these tables as the above ones may not get the result required.

Both MAP_0 and SLOPE are modified by the Overlap Angle (CAM_OVERLAP). If your dyno does not log Cam Overlap angle we will use the following VCT table to "guess" the angle:


For our example we will assume at least a load of 1 and hence our overlap will be 20 degrees

We will be using the example from Part 1 for the calculation. Catch code is 77DA, use the Calibration Utility to download the Stock file.

SLOPE Overlap Corrections

  1. Lookup on the table auF0061 (in the example  the value is 19200) = SLOPE_VALUE = [19200]
  2. Lookup table auF0064(RPM,CAM_OVERLAP) the adder value SLOPE_ADDER = [0.0 ]
  3. Lookup table auF0063(RPM,CAM_OVERLAP) for the Multiplier = SLOPE_MULT = [ 0.83]
  4. SLOPE =  SLOPE_VALUE + SLOPE_ADDER) * SLOPE_MULT = (19200 + 0) * -.83 = 15930
  5. Lookup auF16632(RPM,%Load = TC = [1.0] from Part 2  
  6. SLOPE = SLOPE * TC = 15930

MAP_O Overlap Corrections

  1. Lookup auF0056(RPM,CAM_ANGLE) to get the MAP_ZERO value as per example 1: MAP_ZERO = [2.7]
  2. Lookup auF0066(RPM,CAM_OVERLAP) to get the adder term: MAP_ZERO_ADDER = [0.0]
  3. Lookup auF0065(RPM,CAM_OVERLAP) to get the multiplier term: MAP_ZERO_MULT = [1.0]
  4. Lookup auF0058(BAROMETRIC PRESSURE) to get the correction: MAP_ZERO_BARO_CORRECTION = [1.0 @ FSTP]
  5. MAP_0 = [ (MAP_ZERO + MAP_ZERO_ADDER) * MAP_ZERO_MULT] * MAP_ZERO_BARO_CORRECTION] = [ (2.7 + 0.0) * 1.0] * 1.0

So for the Turbo the Ford Calibrators did not do much with the MAP_0 overlap corrections but if you have a look at the SLOPE Correction they have applied a value which would indicate an approximate increase of 20% fuel (1/0.83) which implies a 20% improvement for Air Mass using VCT.

  • Like 2
  • Thanks 1
Link to comment
Share on other sites

6 hours ago, Roland@pcmtec said:

Yes you need to use the IMRC tables as well depending on whether the IMRC runner is open or closed. Turbo has the IMRC removed so it is a bit simpler.

Ok, thanks for clearing that up, I thought it was the other way round


Link to comment
Share on other sites

  • 1 month later...

for the BF is the VE Correction table 16632 uses inverse numbers i.e:

slope = 1 / auF16454 fg/ auF16632 bf tuning correction (rpm, load) * (auF0059 fg / auF0061 bf slope of map (n, cam_angle) + auF2928 fg/auF0064 bf slope overlap adder (rpm,overlap_angle) )

from a previous Post by Roland.

Slope = 1/auf16632 * (auf0061 + auf0064)



Link to comment
Share on other sites

Good question - seem not have asked one.  But it should have been:

Does VE Correction table 16632 get inverted and then used in the air map calculation.  i.e. make the system leaner? 

Slope = 1/auf16632 * (auf0061 + auf0064)

Slope = 1/VECorrection * (Slope of MAP per air charge + CAM adjust slope).  In my case having a V8 with no VCT its 1/VECorrection * Slope of MAP per aircharge.

Is this correct.  


Link to comment
Share on other sites

I'm not sure off the top of my head. Those kind of questions are easier to answer by experimenting, just put some silly numbers in there and see what happens.

Something to be aware of, the load is not actual measured load, but inferred load based on throttle opening. So the load numbers you see on tuning correction are not going to match your load on the spark map.

Link to comment
Share on other sites

  • 7 months later...

Hi, I have a question regarding the calculation to increase the calculated air mass in order to get extra fuel, this calculation is based on the commanded lambda being less than the actual lambda. So if in the case where the commanded is more than the actual lambda, it may be obvious but i'm just checking if I simply do the inverse when calculating?

In other words where the equation says to multiply I would divide?



Link to comment
Share on other sites

  • 1 month later...

Hi, I've come back to the subject of Speed Density again to study it some more and have a question regarding the IMRC.

I have discovered that the switch/s are auF0013 = "0" and auF0012 is also "0".

I take it this means "off"

The car is the XR6 N/A with a CAI

Also, in my limited understanding of Speed Density tuning, wouldn't it be better to have the IMRC operational?

Thanks in advance


Link to comment
Share on other sites

  • 3 months later...

There is no load axis. It uses the speed density algorithm as discussed above. 

Approximated as

Air mass = map * slope + offset

As you can see you don't need a load axis as map pressure takes that into account for you. It is a linear relationship for a given rpm point. 

If fueling is off at cruise only you modify the offset table, if it's linearly off at all loads you modify the slope table. 

Link to comment
Share on other sites

1 hour ago, JMSMotorsport said:

Ah yep, so basically you tune this single axis table at say wot on a ramp run and then every other load area is worked out by the pcm’s algorithms. That’s a bloody good system. 

Yep so in a perfect world you simply enter your lambda value in the base fuel table and happy days, all loads/boost levels will match that lambda. This assumes your injectors and speed density are dialled in correctly. On a mustang they literally give you a single scalar for fueling at WOT, assuming the rest is stock there is nothing to do as it will match this value.

Once you start changing camshafts and putting large turbo with different backpressure you will need to start manipulating the speed density. On a locked cam V8 its very simple as you'll find your error will almost always be linear so regardless of load you can multiply that rpm cell by your error term and get close to target.

On a VCT enabled car (5.0s have inlet and 4.0s have both inlet and exhaust) you'll find you need to log inlet cam angle, rpm and your fueling error. Then you modify the correct rpm column AND row. 

From a simple perspective you can log VCT inlet angle instead of load and tune it in a similar fashion to how you would log load on say a commodore. The only times you need to adjust the offset table are when you have decel/cruise fueling errors but perfect fueling on full load. This is typical with a larger camshaft as you start getting reversion etc.

Link to comment
Share on other sites

3 minutes ago, JMSMotorsport said:

Thank you, that’s a great explanation. Coming from GM based VE tuning it’s a much different world in the Ford ECM. 

Indeed it is. The main reason for a system like this is the fully variable intake/exhaust cam. As if you were to imagine a commodore with 10 different camshafts (all different overlap in 5 deg increments but the same TDC timing) and their VE maps. Then another 10 different camshafts which are offset +-45 deg from TDC with no overlap and their VE maps. Then trying to somehow tune all 100 VE maps by hand it would be impossible. However if you actually did tune all 100 maps, you'd see that they were simply multiples of each other. Knowing this you could come up with a formula to approximate or guess the VE map without ever actually tuning it, this is basically what the Ford system is.

This system means you can have infinitely variable inlet AND overlap at the same time, and still tune it with only 2 tables.

Link to comment
Share on other sites

2 hours ago, JMSMotorsport said:

Rolan, only thing I’ve missed is the offset table what’s the number of this in the software so I can do a search. 

It is listed above in the post by darryl. Map intercept at zero aircharge is the one you want. The intercept is the c part of the y=mx+c equation, otherwise known as an offset.


  • Thanks 1
Link to comment
Share on other sites

  • 7 months later...
  • 9 months later...
On 1/22/2021 at 5:46 PM, JMSMotorsport said:

I’m curious, in the BA pcm it only has the slope tables for IMRC Open and on the BF it has these plus another BF specific one. At what point is the IMRC open table used on the BF? This is the same between Turbo and Non Turbo? 

Its only used if the IMRC is enabled (eg NA). It is not used at any other time afaik. 

  • Thanks 1
Link to comment
Share on other sites

  • 1 year later...
On 2/6/2019 at 3:36 AM, Darryl@pcmtec said:
  • auF0056: This is the theoretical MAP value when AirCharge is zero.
  • auF0061:  This is the Slope of MAP per AirCharge value used in the speed density calculation

Hey Guys 

Is there any scenario you can think of where auF0056 would need to be altered, or is auF0061 usually the go to for mixture adjustments? (Standard injectors)

Thanks Rob 

Link to comment
Share on other sites

  • 3 weeks later...
On 3/10/2020 at 11:11 AM, Roland@pcmtec said:

0 = Not fitted

1 = Fitted

Hi Roland, I have a 2006 bf NA with stock ECU for the Ute, which I have added a turbo to. Would I turn this option off if I have disconnected the vacuum line to the intake? or does it matter

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...