我目前正在使用 stm32f407g-disc1 并通过 PMOD I2S2 读取音频输入。我已经执行了一些示例,并且硬件工作正常(将数据从 rx 写入到 tx 缓冲区),例如下面的代码。
for (int i=0; i<BUFFER_LENGTH*4; i=i+4) {
txBuf[i] = rxBuf[i];
txBuf[i+1] = rxBuf[i+1];
txBuf[i+2] = 0;
txBuf[i+3] = 0;
}
我现在希望对此传入缓冲区执行 FFT,对其进行操作(我的第一个目标是实现音调变换算法)并再次执行 IFFT。因此我尝试了以下方法:
for (int i=0; i<BUFFER_LENGTH*4; i=i+4) {
fft_in_buf[fft_in_ptr] = (float) ((int) (rxBuf[i]<<16)|rxBuf[i+1]);
fft_in_ptr++;
}
arm_rfft_fast_f32(&fft_handler, fft_in_buf, fft_out_buf, 0);
arm_rfft_fast_f32(&fft_handler, fft_out_buf, fft_in_buf, 1);
fft_in_ptr = 0;
for (int i=0; i<BUFFER_LENGTH*4; i=i+4) {
txBuf[i] = (fft_in_buf[fft_in_ptr] >> 16) & 0xFF; // MSB
txBuf[i + 1] = fft_in_buf[fft_in_ptr] & 0xFF; // LSB
txBuf[i + 2] = 0;
txBuf[i + 3] = 0;
fft_in_ptr++;
}
在主要初始化中我还进行了
arm_rfft_fast_init_f32(&fft_handler, BUFFER_LENGTH);
我的问题是,使用上面的代码我得到的输出非常低(几乎听不见)。我可能遇到了缩放问题,就像我在类似问题中发现的那样,但我仍然无法通过缩放 fft_in_buf[fft_in_ptr] 来使其工作。
我的问题是转换回 txBuf
for (int i=0; i<BUFFER_LENGTH*4; i=i+4) {
txBuf[i] = (fft_in_buf[fft_in_ptr] >> 16) & 0xFFFF; // MSB
txBuf[i + 1] = fft_in_buf[fft_in_ptr] & 0xFFFF; // LSB
txBuf[i + 2] = 0;
txBuf[i + 3] = 0;
fft_in_ptr++;
}