我通过套接字连接接收包含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_fftr和kiss_fftri之间的音频过滤。我认为这样做的出发点是将声音从时域转换到频域,但我并不真正理解从kiss_fftr函数接收的是哪种类型的数据。这些复数中的每一个都存储了什么信息,它的实部和虚部可以告诉我关于频率的信息。我不知道fft_out中覆盖了哪些频率(频率范围)--哪些索引对应哪些频率。
我完全是信号处理和傅立叶变换领域的新手。
有什么帮助吗?
发布于 2012-06-06 20:47:04
在你开始C语言实现之前,先熟悉数字滤波器,特别是FIR filters。
您可以使用类似于GNU Octave's signal工具箱的工具来设计FIR滤波器。看看命令fir1(最简单的)、firls或remez。或者,您也可以通过网页设计FIR滤波器。在网上快速搜索“在线fir滤波器设计”找到this (我还没有用过它,但它似乎使用了remez或firpm命令中使用的等波纹设计)
首先尝试使用直接卷积(没有FFT)实现滤波器,看看速度是否可以接受--这是一种更容易的方法。如果您需要一种基于FFT的方法,可以在kissfft/tools/kiss_FFT fir.c文件中找到overlap save的示例实现。
发布于 2012-06-05 23:23:03
您可能想要研究使用重叠添加或重叠保存算法的FFT快速卷积。您需要根据所需滤波器的脉冲长度来扩展每个FFT的长度。这是因为(1) FFT/IFFT卷积是循环的,以及(2) FFT阵列结果中的每个索引对应于几乎所有频率(正弦形状的响应),而不只是一个(即使大部分接近一个),因此任何单个面元的修改都将泄漏整个频率响应(除了某些精确的周期频率)。
发布于 2013-09-27 17:25:04
我会试着直接回答你的问题。
// a) the real and imaginary components of the output need to be combined to calculate the amplitude at each frequency.
float ar,ai,scaling;
scaling=1.0/(float)size;
// then for each output [i] from the FFT...
ar = fft_out[i].r;
ai = fft_out[i].i;
amplitude[i] = 2.0 * sqrtf( ar*ar + ai*ai ) * scaling ;
// b) which index refers to which frequency? This can be calculated as follows. Only the first half of the FFT results are needed (assuming your 8KHz sampling rate)
for(i=1;i<(size/2);i++) freq = (float)i / (1/8000) / (float)size ;
// c) phase (range +/- PI) for each frequency is calculated like this:
phase[i] = phase = atan2(fft_out[i].i / fft_out[i].r);https://stackoverflow.com/questions/10898307
复制相似问题