STM32F407 - CMSIS DSP - IFFT 不适用于音频输入/输出

问题描述 投票:0回答:1

我目前正在使用 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] 来使其工作。

stm32
1个回答
0
投票

我的问题是转换回 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++;
}
© www.soinside.com 2019 - 2024. All rights reserved.