我已经使用kiss fft库实现了fft到at32ucb系列ucontroller,并且目前正在与fft的输出挣扎。 我的意图是分析来自压电扬声器的声音。 目前,测深仪的频率是420Hz,我从fft输出成功得到(用示波器交叉检查)。但是,如果将函数发生器波形放入系统,输出频率只是预期的一半。 我怀疑它的频率箱计算公式,我错了;目前使用的是fft_peak_magnitude_index *采样频率/ fft_size。 我的输入是真实的,并做到真正的fft。 (输出采样= N/2) 并且还在fft之前进行iir滤波和窗口化。 任何建议将是一个很大的帮助!真正的FFT输出
// IIR filter calculation, n = 256 fft points
for (ctr=0; ctr<n; ctr++)
{
// filter calculation
y[ctr] = num_coef[0]*x[ctr];
y[ctr] += (num_coef[1]*x[ctr-1]) - (den_coef[1]*y[ctr-1]);
y[ctr] += (num_coef[2]*x[ctr-2]) - (den_coef[2]*y[ctr-2]);
y1[ctr] = y[ctr] - 510; //eliminate dc offset
// hamming window
hamming[ctr] = (0.54-((0.46) * cos(2*M_PI*ctr/n)));
window[ctr] = hamming[ctr]*y1[ctr];
fft_input[ctr].r = window[ctr];
fft_input[ctr].i = 0;
fft_output[ctr].r = 0;
fft_output[ctr].i = 0;
}
kiss_fftr_cfg fftConfig = kiss_fftr_alloc(n,0,NULL,NULL);
kiss_fftr(fftConfig, (kiss_fft_scalar *)fft_input, fft_output);
peak = 0;
freq_bin = 0;
for (ctr=0; ctr<n1; ctr++)
{
fft_mag[ctr] = 10*(sqrt((fft_output[ctr].r * fft_output[ctr].r) + (fft_output[ctr].i * fft_output[ctr].i)))/(0.5*n);
if(fft_mag[ctr] > peak)
{
peak = fft_mag[ctr];
freq_bin = ctr;
}
frequency = (freq_bin*(10989/n)); // 10989 is the sampling freq
//************************************
//Usart write
char filtResult[10];
//sprintf(filtResult, "%04d %04d %04d\n", (int)peak, (int)freq_bin, (int)frequency);
sprintf(filtResult, "%04d %04d %04d\n", (int)x[ctr], (int)fft_mag[ctr], (int)frequency);
char c;
char *ptr = &filtResult[0];
do
{
c = *ptr;
ptr++;
usart_bw_write_char(&AVR32_USART2, (int)c);
// sendByte(c);
} while (c != '\n');
}
再次感谢您的亲切回答。我根据你的建议进行了编辑,这很有道理。 函数发生器输入现在给我正确的输出。然而,现在压电输出增加了一倍......所以一直有两个输入条件失去了两倍.. – Jin
由于您没有发布该部分,因此无法真正对压电数据采集发表评论。但是,我要检查的第一件事是采样率设置,以及您是在处理8位还是16位采样。 – SleuthEye
我刚刚发现,piezo只是在840Hz处发生谐振......用示波器fft进行交叉检查我的fft量具有完全相同的模式。 非常感谢! – Jin