- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在通过包含 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
中涵盖了哪些频率(什么频率跨度)——哪些索引对应于哪些频率。
我是信号处理和傅里叶变换主题方面的新手。
有什么帮助吗?
最佳答案
在您全力投入 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/
我正在通过包含 320 个样本的数据包中的套接字连接接收 PCM 数据。声音采样率为每秒 8000 个样本。我正在用它做这样的事情: int size = 160 * 2;//160; int isi
我在理解如何正确使用 KissFFT (1.2.9) 时遇到一些问题。我现在想要实现的是执行 FFT,然后立即执行 iFFT 以再次重建原始信号。下面的代码片段演示了我在做什么: void test(
我在较短的音频片段(44100 * 14 个样本)和更长的音频片段(44100 * 60 * 6 个样本)之间执行互相关。据我了解,因此我无法对 FFT 进行窗口化。在测试 kiss_fftr 和 k
我正在使用 KissFFT 的真实函数来转换一些真实的音频信号。我很困惑,因为我输入了带有 nfft 样本的真实信号,但结果是 nfft/2+1 复杂 频率仓。 来自 KissFFT 的自述文件: 真
我是一名优秀的程序员,十分优秀!