SOCC now keeps NOAA's GOES calibration advice on-line, so you should regard their values as authoritative.
I also try to keep up a personal summary of calibration and validation issues.
There are five GOES-I/M Imager channels and six operational products defined by NOAA. To make your own products, you can download raw data files in "counts", but then you need to convert the raw data to radiances or brightness temperatures. The following sections decribe how to do that.
Radiance = (m * counts) + b Factory-determined values for the m and b coefficients for the visible detectors on GOES-8 are: DETECTOR m b 1 0.5528077 -15.4116 2 0.5501873 -15.3044 3 0.5539745 -15.3890 4 0.5508329 -15.2684 5 0.5509455 -15.3111 6 0.5521899 -15.2730 7 0.5504590 -15.3534 8 0.5507281 -15.3300 Factory-determined values for the m and b coefficients for the visible detectors on GOES-9 are: DETECTOR m b 1 0.5549535 -16.2215 2 0.5576797 -16.3072 3 0.5492361 -16.2326 4 0.5636544 -16.7857 5 0.5575209 -16.4841 6 0.5513512 -16.1666 7 0.5560950 -16.1049 8 0.5604082 -16.6743
These factory values for the zero-point, b, are a little off because the factory at ITT in Fort Wayne, Indiana, is not as dark as outer space.
The m and b values are fractional floating-point numbers, while the raw counts are 10-bit integers. As a side-effect of mixing integers with fractions, you never get a visible pixel that is exactly zero radiance.
NOAA/NESDIS now normalizes the data from the visible-channel detectors of the GOES-8 Imager so that all the data appear to originate from logical detector #6. This is done to minimize the line-to-line variation ("striping") in the images. The implication for users is that they should apply the GOES-8 calibration coefficients for detector #6 (physical detector #2) to the data from ALL visible detectors. The cal coeffs for detectors #1-5 and #7-8 should not be used as long as NOAA-NESDIS normalizes GOES-8 to detector #6. For GOES-9, NOAA-NESDIS will normalize to logical detector #7 (physical #3).
For GOES-8 visible m = 0.5521899 and b = -15.2730 (normalized to detector #6) For GOES-9 visible m = 0.5560950 and b = -16.1049 (normalized to detector #7) Radiance = m*counts + b
To dynamically normalize the visible channels, line-by-line, to the actual observed space-count values, use the calibration formula:
Radiance = m * (counts - counts_in_space) Values of counts_in_space are available in the GVAR "Imager Spacelook Calibration Statistics and Data" block 11's.In the spring of 1996, NOAA-NESDIS changed the content of the visible data in the GVAR. Instead of sending out scene counts, they send out scene counts minus space counts, plus 29. The "plus 29" guarantees that the overall image brightnesses won't fall by approximately 29 counts when we make the change; also, that the signal from space won't be negative.
To convert a GOES-I/M visible Imager radiance (Watts/etc.) to albedo (a fractional value between zero and one), apply the following formula to every detector:
Albedo = c * Radiance (converts W/(m^2-sr-um) to albedo) For GOES-8: c = 1.92979E-03 For GOES-9: c = 1.94180E-03
These are all pre-launch values. Post-launch is something else, since the optics undergo unmonitored changes during launch and flight. In fact, post-launch comparisons between the visible brightness of the same places at the same times from GOES-8 and GOES-9 show that GOES-8 is about 15% fainter than GOES-9. Mike Weinreb of NOAA-NESDIS says:
"In July 1995, for a given scene, GOES-8 measured an approximately 15% lower radiance (derived from the pre-launch cal coefficients) than did GOES-9. I can send you an informal memo on that if you're interested. I would suggest that you multiply the GOES-8 calibration slopes (radiance/count) in GVAR by about 1.15. (You can see that without an on-board calibration, the vis channels are not really radiometers, unfortunately, i.e., their calibration is qualitative, not quantitative.) "
Radiance = [counts - ScalingBias]/ScalingGain where CHANNEL 2 3 4 5 ScalingGain 227.3889 38.8383 5.2285 5.0273 ScalingBias 68.2167 29.1287 15.6854 15.3332
The biases are fractional floating-point numbers, while the raw counts are 10-bit integers (range 0-1023). So, count-minus-bias differences always have a fractional part, and you never get a pixel that is exactly zero radiance to worry about when computing the brightness temperature from the inverse of the Plank Function. You will get negative radiances, however, due to random noise and calibration errors.
To convert to brightness temperatures, use the inverse Plank function with the wavenumber for the channel (Nu). The inverse Plank function for brightness temperature is:
Btemp = [c2*Nu]/ln{1+[(c1*Nu^3)/Radiance]} where (in cgs units): c1 = 2hc^2 = 1.191066E-5 radiance/(cm^-1)^3 c2 = hc/k = 1.438833 K/(cm^-1) Nu is in wavenumbers (cm^-1) Rad is in radiance erg/(cm^2 sec sterradian cm^-1) Btemp is in Kelvin KNotes: There are approximately 100 cgs radiance units (aka exitance) for a 300 K scene at 10 microns (Lambda = 1E-5 meter = 1E-3 cm, Nu = waves-per-centimeter = 1,000 cm-1). Some forms of the Plank function include the integral over solid angle, in which case c1 has another factor of pi. NOAA uses this form.
NOAA suggests additional factors, a and b, to create a "scene temperature", compensating for the small shift in effective wavenumber with scene brightness.
Tscene = a + (b * Btemp) for GOES-8 CHANNEL DETECTOR SIDE Nu (cm^-1) a b (K) 2 1 1 2556.65 -0.575836 1.00152 2 2 1 2557.15 -0.580028 1.00152 3 1 1 1481.85 -0.588961 1.00143 4 1 1 934.25 -0.313687 1.00126 4 2 1 934.35 -0.296247 1.00122 5 1 1 837.05 -0.420806 1.00117 5 2 1 836.15 -0.341538 1.00102 2 1 2 2558.55 -0.578505 1.00154 2 2 2 2559.05 -0.579519 1.00154 3 1 2 1482.65 -0.607246 1.00138 4 1 2 935.35 -0.344946 1.00128 4 2 2 934.75 -0.316590 1.00127 5 1 2 836.95 -0.456146 1.00123 5 2 2 836.75 -0.413154 1.00116 for GOES-9 CHANNEL DETECTOR SIDE Nu (cm^-1) a b (K) 2 1 1 2555.15 -0.580725 1.000955 2 2 1 2555.15 -0.580725 1.000955 3 1 1 1481.75 -0.489100 1.001092 4 1 1 934.55 -0.377608 1.001284 4 2 1 934.25 -0.358734 1.001264 5 1 1 833.95 -0.288899 1.000914 5 2 1 834.05 -0.296517 1.000926 2 1 2 2 2 2 3 1 2 4 1 2 4 2 2 5 1 2 5 2 2
Note that the effective wavenumber (Nu) and scene temperature factors are slightly different for the upper and lower detectors for IR channels 2, 4 and 5, and are also different for the two redundant sides. Unfortunately, the detector/side information can get lost before you get the data, and so these scene temperature corrections can't be applied.
For GOES-K (GOES-10), NOAA preferred to issue look-up tables (LUTs) that convert 1024 possible digital counts for each IR channel to correcponding radiance, brightness temperature, and "mode A" (8-bit count) values, listed separately for side 1 and for side 2 electronics.
GOES-10's Sounder's shortwave upper air channels were miscalibrated before launch, leading to discrepancies of a few degrees with respect to GOES-8 and GOES-9. NESDIS at the University of Wisconsin is applying fudge factors to bring them back in-line.
The visible channel on GOES-9 is about 16% (+-2%) more sensitive than GOES-8's, according to tests conducted by Mike Weinreb at NOAA-NESDIS in July 1995.
Upper/lower IR detector pairs inevitably show small differences, and images will appear slightly striped, especially in channel 5. The longwave IR detectors have "1/f noise", an unavoidable increase in drifts at low frequencies (below 100 Hz, in our case), which cause additional detector-to-detector differences.
Sunlight inevitably gets into the Imager's aperture near sub-satellite midnight, confounding the internal calibation system, especially in the shortwave window, channel 2 at 3.9 microns. NOAA/NESDIS may time-interpolate the calibration coefficients between the hours before and after midnidnight, since this is better than using sun-contaminated coefficients.
There is a problem with the infrared emissivity of the scan mirror being angle-dependent. Consequently, outer space appears brighter on one side of the Earth than the other by a few dozen counts, especially in channels 4 and 5. After April 1995, this mirror emissivity effect is minimized by pre-processing software before the data is broadcast in GVAR.
The detector patch temperature of the Imager is raised from 94K to 101K from May to August. Because the patch is on the north face of the satellite, it runs warmer in the summertime, making the radiometric data noisier when the CONUS scenes are hotter, to minimize the imapct on S/N.
On 9 May 1995, Imager calibration was modified to include the filtering of calibration slopes in the infrared channels. This is intended to reduce image-to-image variations in brightness and east-west striping. As a side-effect, discontinuities are introduced when the spacelook is switched from east space to/from west space twice per day.
Date: Fri, 1 Mar 1996 11:45:25 +0500 From: mweinreb@nesdis.noaa.gov (Mike Weinreb) Subject: GOES Calibration Weekly GOES-9 Since February 27, the output of detector 6 of the Imager's visible channel has been running between three and seven counts (out of 1024) higher than normal for several hours just before the daily eclipse outages. This causes east-west "pinstriping" in the high-resolution images. A similar malfunction occurred during the eclipse period last fall. The "relativization" algorithm, which will become operational with the Sensor Processing System rehost in mid-March, should get rid of the pinstripes. The striping in images from channel 4 of the Imager has become more severe. Until recently it had been much less obtrusive than the striping from the GOES-8 Imager. Now, however, it is almost as bad. The rms of the GOES-9 striping, approximately 0.06K (at 300K) on November 10, 1995, was approximately 0.17K on Feb. 22, 1996.
Topic: GOES-11 Visible Channel Calibration Update Message Issued: June 21, 2006, 1915 UTC Satellites Impacted: GOES-11 Products Impacted: GOES-11 Imager Visible Channel Date/Time of Initial Impact: June 21, 2006 16:00 UTC ----------------------------------------- Details: The following information was received from OSO regarding the GOES-11 Visible Channel Calibration: Dear GOES Visible Channel Users: GOES-11 replaced GOES-10 as GOES-WEST at 16:00 UTC on June 21. The following correction is recommended to compensate for its Imager visible channel degradation: R_post = 1.154*R_pre where R_pre is the reflectance (albedo) one obtains with pre-launch calibration coefficients, and R_post is the same with post-launch calibration. Note that R can also be radiance on both sides of the equation. For example, in GOES-11 2006_177 (June 20, 2006) 21:00:00 image, at 1:00:48N and 135:00:01W (normal image line 7754 and element 13837), the raw count is 196. Using pre-launch calibration coefficients, this represents reflectance of 18.9% (McIDAS). The calibrated reflectance using post-launch calibration should be: R_post = 1.154*18.9% = 21.8% Please keep in mind that this is an initial assessment of GOES-11 Imager visible channel calibration for operation on Day 1. The calibration update, for example, has not been made time-dependent. More analyses will follow as we collect more data. -------------------------------------- Contact Information: Brian Hughes Satellite Services Division NOAA/NESDIS/OSDPD 301-763-8051 x106 brian.hughes@noaa.gov See http://www.ssd.noaa.gov/PS/SATS/messages.html for this and other satellite related messages. See http://www.ssd.noaa.gov for full GOES scanning schedules.
First, clip all scene temperatures to be in the range 163K to 330K Then Mode-A (counts) = 418K - Tscene (for Tscene between 163K and 242K) Mode-A (counts) = 660K - 2*Tscene (for Tscene between 242K and 330K)This inverts the intensity -- 330K corresponds to zero counts, while 163K corresponds to 255 counts. It also maps the warmest 88K into the first 176 counts (0.5K/count), and maps the coldest 80K into the last 80 counts (1.0K/count). Consequently, typical scene temperatures between 220K and 300K map into middle-grey levels between 200 and 60 counts, respectively.
MODE-A lookup table Tscene (K) ModeA (count) 330 0 329.5 1 329 2 328.5 3 328 4 327.5 5 327 6 326.5 7 326 8 325.5 9 325 10 324.5 11 324 12 323.5 13 323 14 322.5 15 322 16 321.5 17 321 18 320.5 19 320 20 319.5 21 319 22 318.5 23 318 24 317.5 25 317 26 316.5 27 316 28 315.5 29 315 30 314.5 31 314 32 313.5 33 313 34 312.5 35 312 36 311.5 37 311 38 310.5 39 310 40 309.5 41 309 42 308.5 43 308 44 307.5 45 307 46 306.5 47 306 48 305.5 49 305 50 304.5 51 304 52 303.5 53 303 54 302.5 55 302 56 301.5 57 301 58 300.5 59 300 60 299.5 61 299 62 298.5 63 298 64 297.5 65 297 66 296.5 67 296 68 295.5 69 295 70 294.5 71 294 72 293.5 73 293 74 292.5 75 292 76 291.5 77 291 78 290.5 79 290 80 289.5 81 289 82 288.5 83 288 84 287.5 85 287 86 286.5 87 286 88 285.5 89 285 90 284.5 91 284 92 283.5 93 283 94 282.5 95 282 96 281.5 97 281 98 280.5 99 280 100 279.5 101 279 102 278.5 103 278 104 277.5 105 277 106 276.5 107 276 108 275.5 109 275 110 274.5 111 274 112 273.5 113 273 114 272.5 115 272 116 271.5 117 271 118 270.5 119 270 120 269.5 121 269 122 268.5 123 268 124 267.5 125 267 126 266.5 127 266 128 265.5 129 265 130 264.5 131 264 132 263.5 133 263 134 262.5 135 262 136 261.5 137 261 138 260.5 139 260 140 259.5 141 259 142 258.5 143 258 144 257.5 145 257 146 256.5 147 256 148 255.5 149 255 150 254.5 151 254 152 253.5 153 253 154 252.5 155 252 156 251.5 157 251 158 250.5 159 250 160 249.5 161 249 162 248.5 163 248 164 247.5 165 247 166 246.5 167 246 168 245.5 169 245 170 244.5 171 244 172 243.5 173 243 174 242.5 175 242 176 241 177 240 178 239 179 238 180 237 181 236 182 235 183 234 184 233 185 232 186 231 187 230 188 229 189 228 190 227 191 226 192 225 193 224 194 223 195 222 196 221 197 220 198 219 199 218 200 217 201 216 202 215 203 214 204 213 205 212 206 211 207 210 208 209 209 208 210 207 211 206 212 205 213 204 214 203 215 202 216 201 217 200 218 199 219 198 220 197 221 196 222 195 223 194 224 193 225 192 226 191 227 190 228 189 229 188 230 187 231 186 232 185 233 184 234 183 235 182 236 181 237 180 238 179 239 178 240 177 241 176 242 175 243 174 244 173 245 172 246 171 247 170 248 169 249 168 250 167 251 166 252 165 253 164 254 163 255
{ [0] { [0] { [0] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } [1] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } } [1] { [0] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } [1] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } } } [1] { [0] { [0] struct Radiometric { Nu = 2556.6500000000001 BtGain = 1.00152 BtBias = -0.57583600000000001 ScalingGain = 227.38890075683594 ScalingBias = 68.216705322265625 Units = 2 Table = 0x102f4150 } [1] struct Radiometric { Nu = 2558.5500000000002 BtGain = 1.0015400000000001 BtBias = -0.57850500000000005 ScalingGain = 227.38890075683594 ScalingBias = 68.216705322265625 Units = 2 Table = 0x10434a98 } } [1] { [0] struct Radiometric { Nu = 2557.1500000000001 BtGain = 1.00152 BtBias = -0.58002799999999999 ScalingGain = 227.38890075683594 ScalingBias = 68.216705322265625 Units = 2 Table = (nil) } [1] struct Radiometric { Nu = 2559.0500000000002 BtGain = 1.0015400000000001 BtBias = -0.57951900000000001 ScalingGain = 227.38890075683594 ScalingBias = 68.216705322265625 Units = 2 Table = (nil) } } } [2] { [0] { [0] struct Radiometric { Nu = 1418.8499999999999 BtGain = 1.00143 BtBias = -0.58896099999999996 ScalingGain = 38.838302612304688 ScalingBias = 29.128692626953125 Units = 2 Table = 0x104352a0 } [1] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } } [1] { [0] struct Radiometric { Nu = 1412.6500000000001 BtGain = 1.0013799999999999 BtBias = -0.60741999999999996 ScalingGain = 38.838302612304688 ScalingBias = 29.128692626953125 Units = 2 Table = (nil) } [1] struct Radiometric { Nu = 0.0 BtGain = 0.0 BtBias = 0.0 ScalingGain = 0.0 ScalingBias = 0.0 Units = 0 Table = (nil) } } } [3] { [0] { [0] struct Radiometric { Nu = 934.25 BtGain = 1.00126 BtBias = -0.31368699999999999 ScalingGain = 5.2285003662109375 ScalingBias = 15.685400009155273 Units = 2 Table = 0x10071eb0 } [1] struct Radiometric { Nu = 935.35000000000002 BtGain = 1.0012799999999999 BtBias = -0.34494599999999997 ScalingGain = 5.2285003662109375 ScalingBias = 15.685400009155273 Units = 2 Table = 0x101b27f8 } } [1] { [0] struct Radiometric { Nu = 934.35000000000002 BtGain = -0.29624699999999998 BtBias = 1.00122 ScalingGain = 5.2285003662109375 ScalingBias = 15.685400009155273 Units = 2 Table = (nil) } [1] struct Radiometric { Nu = 935.75 BtGain = 1.0012700000000001 BtBias = -0.31658999999999998 ScalingGain = 5.2285003662109375 ScalingBias = 15.685400009155273 Units = 2 Table = (nil) } } } [4] { [0] { [0] struct Radiometric { Nu = 837.04999999999995 BtGain = -0.42080600000000001 BtBias = 1.0011699999999999 ScalingGain = 5.0272998809814453 ScalingBias = 15.333200454711914 Units = 2 Table = 0x101b3000 } [1] struct Radiometric { Nu = 836.95000000000005 BtGain = -0.456146 BtBias = 1.0012300000000001 ScalingGain = 5.0272998809814453 ScalingBias = 15.333200454711914 Units = 2 Table = 0x102f3948 } } [1] { [0] struct Radiometric { Nu = 836.14999999999998 BtGain = -0.34153800000000001 BtBias = 1.00102 ScalingGain = 5.0272998809814453 ScalingBias = 15.333200454711914 Units = 2 Table = (nil) } [1] struct Radiometric { Nu = 836.75 BtGain = -0.41315400000000002 BtBias = 1.00116 ScalingGain = 5.0272998809814453 ScalingBias = 15.333200454711914 Units = 2 Table = (nil) } } } }