gpt4 book ai didi

c - kiss_fftr 的 KissFFT 输出

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:12 26 4
gpt4 key购买 nike

我正在通过包含 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 实现之前,请先熟悉数字滤波器,尤其是 FIR filters .

您可以使用类似 GNU Octave's 的方式设计 FIR 滤波器信号工具箱。查看命令 fir1(最简单的)、firls 或 remez。或者,您可以通过网页设计 FIR 滤波器。在网络上快速搜索“在线 fir 滤波器设计”可找到 this (我没用过,不过好像用了remez或者firpm命令中用到的等波纹设计)

首先尝试使用直接卷积(不使用 FFT)来实现您的滤波器,看看速度是否可以接受——这是一个更简单的方法。如果您需要基于 FFT 的方法,可以在 kissfft/tools/kiss_fastfir.c 文件中找到重叠保存的示例实现。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com