【发布时间】:2012-06-05 13:33:01
【问题描述】:
我正在通过套接字连接接收包含 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 中覆盖了哪些频率(什么频率跨度) - 哪些索引对应于哪些频率。
我是信号处理和傅里叶变换主题的新手。
有什么帮助吗?
【问题讨论】:
-
这是题外话;可能更适合例如dsp.stackexchange.com。但实际上,您可能应该为自己准备一本不错的 DSP 入门书籍(例如 this),因为这个主题太大,无法在 StackOverflow 风格的答案中充分涵盖。
标签: c audio filter fft kissfft