我正在接收包含320个样本的数据包中的PCM数据通过套接字连接。声音的采样率为每秒8000个采样。我正在做这样的事情:

int size = 160 * 2;//160;
int isinverse = 1;
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_in[size];
kiss_fft_cpx fft_out[size];
kiss_fft_cpx fft_reconstructed[size];

kiss_fftr_cfg fft = kiss_fftr_alloc(size*2 ,0 ,0,0);
kiss_fftr_cfg ifft = kiss_fftr_alloc(size*2,isinverse,0,0);

for (int i = 0; i < size; i++) {
    fft_in[i].r = zero;
    fft_in[i].i = zero;
    fft_out[i].r = zero;
    fft_out[i].i = zero;
    fft_reconstructed[i].r = zero;
    fft_reconstructed[i].i = zero;
}

// got my data through socket connection

for (int i = 0; i < size; i++) {
     // samples are type of short
     fft_in[i].r = samples[i];
     fft_in[i].i = zero;
     fft_out[i].r = zero;
     fft_out[i].i = zero;
 }

 kiss_fftr(fft, (kiss_fft_scalar*) fft_in, fft_out);
 kiss_fftri(ifft, fft_out, (kiss_fft_scalar*)fft_reconstructed);

 // lets normalize samples
 for (int i = 0; i < size; i++) {
     short* samples = (short*) bufTmp1;
     samples[i] = rint(fft_reconstructed[i].r/(size*2));
 }

之后,我填充OpenAL缓冲区并播放它们。一切正常,但我想在kiss_fftrkiss_fftri之间进行音频过滤。我认为的出发点是将声音从时域转换到频域,但是我真的不明白我从kiss_fftr函数接收的是哪种数据。这些复数中的每一个中存储了哪些信息,其实部和虚部可以告诉我有关频率的信息。而且我不知道fft_out中涵盖哪些频率(哪个频率范围)-哪些索引对应于哪些频率。

我是信号处理和傅立叶变换主题的新手。

有什么帮助吗?

最佳答案

在开始使用C语言实现之前,请熟悉esp FIR filters数字滤波器。

您可以使用GNU Octave's信号工具箱等设计FIR滤波器。查看命令fir1(最简单的),firs或remez。或者,您也许可以通过网页设计FIR滤波器。在网上快速搜索“online fir filter design”,发现this(我没有使用过,但似乎使用了remez或firpm命令中使用的equiripple设计)

尝试先通过直接卷积(不带FFT)实现滤波器,然后看看速度是否可以接受-这是一条更简单的路径。如果需要基于FFT的方法,则在kissfft / tools / kiss_fastfir.c文件中有一个重叠保存的示例实现。

关于c - kiss_fftr的KissFFT输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10898307/

10-10 14:08