我正在通过包含 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
- 哪些索引对应于哪些频率。
我是信号处理和傅里叶变换主题的新手。
有什么帮助吗?