Fix xAxis cmd for dBFS & dBFS offset (+12dB)

pull/6/merge
boblark 3 years ago
parent 319fa42626
commit deace67137
  1. 17
      analyze_fft256_iq_F32.cpp
  2. 13
      analyze_fft256_iq_F32.h
  3. 21
      examples/TestFFT256iq/TestFFT256iq.ino

@ -132,15 +132,20 @@ void AudioAnalyzeFFT256_IQ_F32::update(void) {
output[i] = sqrtf(inAf*sumsq[ii]); output[i] = sqrtf(inAf*sumsq[ii]);
else if(outputType==FFT_POWER) else if(outputType==FFT_POWER)
output[i] = inAf*sumsq[ii]; output[i] = inAf*sumsq[ii];
else if(outputType==FFT_DBFS)
output[i] = 10.0f*log10f(inAf*sumsq[ii])-42.1442f; // Scaled to FS sine wave else if(outputType==FFT_DBFS) {
if(sumsq[i]>0.0f)
output[i] = 10.0f*log10f(inAf*sumsq[ii]) - 42.144f; // Scaled to FS sine wave
else
output[i] = -193.0f; // lsb for 23 bit mantissa
}
else else
output[i] = 0.0f; output[i] = 0.0f;
} } // End, set output[i] over all 512
} outputflag = true; // moved; rev10mar2021
outputflag = true; } // End of average is finished
release(prevblock_i); // Release the 2 blocks that were block_i release(prevblock_i); // Release the 2 blocks that were block_i
release(prevblock_q); // and block_q on last time through update() release(prevblock_q); // and block_q on last time through update()
prevblock_i = block_i; // We will use these 2 blocks on next update() prevblock_i = block_i; // We will use these 2 blocks on next update()
prevblock_q = block_q; // Just change pointers prevblock_q = block_q; // Just change pointers
} }

@ -1,7 +1,8 @@
/* analyze_fft256_iq_F32.h Assembled by Bob Larkin 6 Mar 2021 /* analyze_fft256_iq_F32.h Assembled by Bob Larkin 6 Mar 2021
* *
* Rev 6 Mar 2021 - Added setXAxis() * Rev 6 Mar 2021 - Added setXAxis()
* Rev 7 Mar 2021 - Corrected bug in applying windowing * Rev 7 Mar 2021 - Corrected bug in applying windowing
* Rev 10 Mar 2021 - Corrrected: dBFS offset (up 12 dB) & xAxis for dBFS
* *
* Does Fast Fourier Transform of a 256 point complex (I-Q) input. * Does Fast Fourier Transform of a 256 point complex (I-Q) input.
* Output is one of three measures of the power in each of the 256 * Output is one of three measures of the power in each of the 256
@ -17,6 +18,7 @@
* * Windowing None, Hann, Kaiser and Blackman-Harris. * * Windowing None, Hann, Kaiser and Blackman-Harris.
* * Multiple bin-sum output to simulate wider bins. * * Multiple bin-sum output to simulate wider bins.
* * Power averaging of multiple FFT * * Power averaging of multiple FFT
* * Programmable frequency scale arrangement.
* * Soon: F32 audio outputs for I & Q * * Soon: F32 audio outputs for I & Q
* *
* Conversion Copyright (c) 2021 Bob Larkin * Conversion Copyright (c) 2021 Bob Larkin
@ -76,11 +78,10 @@
* If there is 180 degree phase shift to I or Q these all get reversed. * If there is 180 degree phase shift to I or Q these all get reversed.
* *
* Timing, max is longest update() time: * Timing, max is longest update() time:
* T3.6 Windowed, RMS out, - uSec max * T3.6 Windowed, Power Out, 285 uSec max
* T3.6 Windowed, Power Out, - uSec max * T3.6 Windowed, dBFS out, 590 uSec max
* T3.6 Windowed, dBFS out, - uSec max * T3.6 No Window saves 28 uSec for any output.
* No Window saves 60 uSec on T3.6 for any output. * T4.0 Windowed, dBFS Out, 120 uSec
* T4.0 Windowed, RMS Out, - uSec
* *
* Scaling: * Scaling:
* Full scale for floating point DSP is a nebulous concept. Normally the * Full scale for floating point DSP is a nebulous concept. Normally the

@ -18,14 +18,13 @@ AudioConnection_F32 patchCord2(sine_cos1, 1, FFT256iq1, 1);
// GUItool: end automatically generated code // GUItool: end automatically generated code
void setup(void) { void setup(void) {
float* pPwr;
Serial.begin(9600); Serial.begin(9600);
delay(1000); delay(1000);
AudioMemory_F32(20); AudioMemory_F32(20);
Serial.println("FFT256IQ Test v2"); Serial.println("FFT256IQ Test v3");
sine_cos1.amplitude(1.0); // Initialize Waveform Generator sine_cos1.amplitude(1.0); // Initialize Waveform Generator
// bin spacing = 44117.648/256 = 172.335 172.3 * 4 = 689.335 Hz (T3.6) // bin spacing = 44117.648/256 = 172.335 172.3 * 4 = 689.335 Hz (T3.6)
// Half bin higher is 775.3 for testing windows // Half bin higher is 775.3 for testing windows
//sine_cos1.frequency(689.34f); //sine_cos1.frequency(689.34f);
@ -39,7 +38,7 @@ void setup(void) {
// or pick any old frequency // or pick any old frequency
sine_cos1.frequency(7100.0); sine_cos1.frequency(7100.0);
// elect the output format // Select the output format: FFT_RMS, FFFT_POWER, FFT_DBFS
FFT256iq1.setOutputType(FFT_DBFS); FFT256iq1.setOutputType(FFT_DBFS);
// Select the wndow function // Select the wndow function
@ -55,14 +54,12 @@ void setup(void) {
// xAxis, bit 0 left/right; bit 1 low to high; default 0X03 // xAxis, bit 0 left/right; bit 1 low to high; default 0X03
FFT256iq1.setXAxis(0X03); FFT256iq1.setXAxis(0X03);
FFT256iq1.windowFunction(AudioWindowBlackmanHarris256);
//float* pw = FFT256iq1.getWindow(); // Print window
//for (int i=0; i<256; i++) Serial.println(pw[i], 4);
// Do power averaging (outputs appear less often, as well) // Do power averaging (outputs appear less often, as well)
FFT256iq1.setNAverage(5); // nAverage >= 1 FFT256iq1.setNAverage(1); // i.e., 16 or 50, etc. nAverage >= 1
}
delay(1000); void loop(void) {
float* pPwr;
if( FFT256iq1.available() ) { if( FFT256iq1.available() ) {
pPwr = FFT256iq1.getData(); pPwr = FFT256iq1.getData();
for(int i=0; i<256; i++) { for(int i=0; i<256; i++) {
@ -72,7 +69,5 @@ void setup(void) {
} }
Serial.print("\n\n"); Serial.print("\n\n");
} }
} delay(500);
void loop(void) {
} }

Loading…
Cancel
Save