Serial.begin(115200);
delay(1000);
fft_in = (float*)heap_caps_malloc(2 * N * sizeof(float), MALLOC_CAP_SPIRAM);
if (fft_in != nullptr) Serial.println("
dsps_fft2r_init_fc32(NULL, CONFIG_DSP_MAX_FFT_SIZE);
// 生成测试信号
for (int i = 0; i < N; i++) {
float t = (float)i / SAMPLE_RATE;
fft_in[2 * i] = sinf(2 * M_PI * 100 * t); // 100Hz 正弦波
fft_in[2 * i + 1] = sinf(2 * M_PI * 200 * t); // 200Hz 正弦波
}
// **计算 FFT**
dsps_fft2r_fc32(fft_in, N);
dsps_bit_rev2r_fc32(fft_in, N);
dsps_cplx2reC_fc32(fft_in, N);
showData(fft_in, N, "Parallel FFT 结果");
}
以上代码展示了将两个实数信号同时加载到fft_in并进行双边fft的过程。fft结果最终会返回到fft_in内,其中前半部分是100hz正弦波的实轴频点信息,而后半部分是200hz的实轴频点信息。
对于单边fft(即仅加载一个实数信号到fft_in, fft_in内表示虚部的部分设置为0), 从fft结果恢复原信号有很多方法,因为其结果包含频域的实轴和虚轴信息。对于双边fft,虽然在标准化后可以恢复DC频率,以及实轴和虚轴的信息(因为实轴虚轴对称),但是Nyquist频点信息会丢失。
fft_in
[0] (0)0.000000 + (1)0.000000 i
[1] (2)0.587785 + (3)0.951057 i
[2] (4)0.951057 + (5)0.587785 i
[3] (6)0.951056 - (7)0.587785 i
[4] (8)0.587785 - (9)0.951056 i
[5] (10)0.000000 - (11)0.000000 i
[6] (12)-0.587785 + (13)0.951057 i
[7] (14)-0.951057 + (15)0.587785 i
[8] (16)-0.001322 + (17)0.000000 i
[9] (18)-0.000000 + (19)0.000000 i
fft_x1 (单边加载100hz正弦波信号)
[0] (0)0.000000 + (1)0.000000 i
[1] (2)0.587785 + (3)0.000000 i
[2] (4)0.951057 + (5)0.000000 i
[3] (6)0.951056 + (7)0.000000 i
[4] (8)0.587785 + (9)0.000000 i
[5] (10)0.000000 + (11)0.000000 i
[6] (12)-0.587785 + (13)0.000000 i
[7] (14)-0.951057 + (15)0.000000 i
[8] (16)-0.001322 + (17)0.000000 i
[9] (18)-0.000000 + (19)0.000000 i
fft_x2 (单边加载200hz正弦波信号)
[0] (0)0.000000 + (1)0.000000 i
[1] (2)0.951057 + (3)0.000000 i
[2] (4)0.587785 + (5)0.000000 i
[3] (6)-0.587785 + (7)0.000000 i
[4] (8)-0.951056 + (9)0.000000 i
[5] (10)-0.000000 + (11)0.000000 i
[6] (12)0.951057 + (13)0.000000 i
[7] (14)0.587785 + (15)0.000000 i
[8] (16)-0.001322 + (17)0.000000 i
[9] (18)0.062500 + (19)0.062500 i
Parallel FFT 结果, 8点fft
[0] (0)1.538842 + (1)0.000000 i
[1] (2)-3.034311 - (3)6.598932 i
[2] (4)0.449028 - (5)1.175571 i
[3] (6)0.683170 - (7)0.443564 i
[4] (8)1.538841 + (9)0.000000 i
[5] (10)4.909618 + (11)1.044053 i
[6] (12)-4.979796 - (13)1.902114 i
[7] (14)-1.105392 - (15)0.409033 i
单边8点fft结果 fft_X1
[0] (0)1.538842 + (1)0.000000 i
[1] (2)-1.517156 - (3)3.299466 i
[2] (4)0.224514 - (5)0.587786 i
[3] (6)0.341585 - (7)0.221782 i
[4] (8)0.363271 + (9)0.000000 i
[5] (10)0.341585 + (11)0.221782 i
[6] (12)0.224514 + (13)0.587786 i
[7] (14)-1.517155 + (15)3.299466 i
单边8点fft结果 fft_X2
[0] (0)1.538841 + (1)0.000000 i
[1] (2)2.454809 + (3)0.522026 i
[2] (4)-2.489898 - (5)0.951057 i
[3] (6)-0.552696 - (7)0.204517 i
[4] (8)-0.363270 + (9)0.000000 i
[5] (10)-0.552696 + (11)0.204517 i
[6] (12)-2.489898 + (13)0.951057 i
[7] (14)2.454809 - (15)0.522026 i
可以看到双边8点fft结果中,不包含单边fft [4]位置的信息,进而不能使用对单边fft进行ifft的方法恢复原信号
所以我想知道如果我使用双边fft加速计算实时信号后,如何再从结果恢复原信号呢,有什么文献参考之类的吗?