问题标签 [kissfft]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
447 浏览

makefile - 了解 makefile 配方

我正在开发一个涉及本机代码的 android 项目,并且我正在尝试将 Kiss FFT 库与 NDK 一起使用。但是,我很难理解 Kiss FFT 使用的 makefile 下面列出的部分。谁可以给我解释一下这个?

我知道第一行定义了目标kiss_fft.s及其先决条件,接下来的四行是配方,其中一行3.4.是编译器命令。但我不懂台词2.5.

任何帮助将不胜感激!

0 投票
1 回答
4514 浏览

c - FFT - 在 PCM 数据上应用窗口

我目前正在尝试重现getSpectrumFMOD 音频库的功能。此函数读取当前播放缓冲区的 PCM 数据,在此数据上应用一个窗口并应用 FFT 以获取频谱。

它返回一个浮点数组,其中每个浮点数介于 0 和 1 dB ( 10.0f * ( float)log10(val) * 2.0f) 之间。

我不确定我应该做什么,所以我会解释一下:

首先,我在 4096 字节缓冲区中获取 PCM 数据,根据文档,PCM 数据由左右一对数据的样本组成。

数据

就我而言,我正在使用上图中的 16 位样本。所以,如果我只想使用左声道,我将左 PCM 数据保存在一个短数组中:

因此,如果一个样本 = 4 个字节,我有 1024 个样本,即代表左通道的 1024 个短路和代表右通道的 1024 个短路。

为了执行 FFT,我需要一个浮点数组并在我的数据上应用一个窗口(汉宁):

wewin是输入,i是数组中的位置和数组s的大小 (1024)。

仅获取左声道:

然后我通过kiss_fft(从真实到复杂)执行FFT。我得到一个kiss_fft_cpx *ouput大小为 1024/2+1 = 513 的(复数数组)。

我计算每个频率的幅度:

以分贝计算:

amp不在 0 和 1 之间。我不知道我必须在哪里规范化我的数据(在 PCM 数据上或最后)。另外我不确定我在 PCM 数据上应用我的窗口的方式。

这是我从 0 到 20kHz 的歌曲中得到的结果,与 getSpectrum 函数的结果相比。(对于矩形窗口

结果

我怎样才能达到相同的结果?

0 投票
3 回答
5483 浏览

c - Kiss_fftr 的 KissFFT 输出

我正在通过包含 320 个样本的数据包中的套接字连接接收 PCM 数据。声音的采样率为每秒 8000 个样本。我正在做这样的事情:

之后我填充 OpenAL 缓冲区并播放它们。一切正常,但我想对 和 之间的音频进行一些kiss_fftr过滤kiss_fftri。我认为的起点是将声音从时域转换为频域,但我真的不明白我从kiss_fftr函数接收到什么样的数据。每个复数中存储了哪些信息,它的实部和虚部可以告诉我有关频率的信息。而且我不知道哪些频率被覆盖(什么频率跨度)fft_out- 哪些索引对应于哪些频率。

我是信号处理和傅里叶变换主题的新手。

有什么帮助吗?

0 投票
3 回答
5325 浏览

fft - KissFFT (kiss_fftr to kiss_fftri) - 如何重建原始信号?

我在理解如何正确使用 KissFFT (1.2.9) 时遇到了一些麻烦。我现在想要实现的只是执行 FFT,然后立即执行 iFFT 以再次重建原始信号。下面的代码片段演示了我在做什么:

我发现这实际上在运行时崩溃。我发现在创建 KissFFT 配置时将大小除以 2 可以停止崩溃:

但是,当我播放重建的音频数据时,它几乎是无声的,带有奇怪的噼啪声。

谁能指出我正确的方向?

非常感谢,P

编辑 1:这就是我包含 KissFFT 头文件并定义 FIXED_POINT 变量的方式:

这确保了 typedef'd 'kiss_fft_scalar' 类型被强制为 int16_t(短)。

编辑 2:目标平台是 Android,所以我还在我的 Android.mk 文件中添加了以下内容:

0 投票
3 回答
1842 浏览

c - KissFFT正向/反向输出噪声,为什么?

我正在尝试在 Java 应用程序中本机使用 KissFFT,但输入信号的正向/反向没有按应有的方式返回:信号幅度几乎不存在。如果我去掉比例因子(除以 2N),结果就是谐波噪声。任何人都可以发现错误吗?

这是转发呼叫(从 GDX 复制,所以应该没问题!):

这是相反的(我写的,可能有错误;)):

0 投票
2 回答
3680 浏览

math - 编译和链接 KISSFFT

我在编译和链接“开箱即用”的kissfft库时遇到了一个新手问题。我已经下载了 Kissfft 库并将其解压缩到一个测试目录。进入目录并运行“make testall”后,我收到以下错误,看起来 std c 数学库没有正确链接。

显然,由于包含了 -lm 选项,makefile 正试图链接到数学库。无法理解这一点。我以前编译过许多正确链接到数学库的程序。任何帮助,将不胜感激。谢谢,-B

0 投票
1 回答
1896 浏览

c++ - Kiss FFT 似乎将数据乘以它转换的点数

我对傅里叶变换的有限理解是,您应该能够在不更改原始数据的情况下在时域和频域之间切换。所以,这里是我(认为我)正在做的总结:

  1. kiss_fft_next_fast_size(994)用于确定我应该使用 1000 。

  2. 用于kiss_fft_alloc(...)创建一个kiss_fft_cfg 。nfft = 1000

  3. 通过将额外点填充为零,将我的输入数据从 994 大小扩展到 1000。

  4. 将Kiss_fft_cfg与我的输入kiss_fft(...)输出数组一起传递。

  5. kiss_fft_alloc(...)用于创建一个反向的kiss_fft_cfg nfft = 1000

  6. 将逆的kiss_fft_cfg传递给kiss_fft(...)输入前一个输出数组。

  7. 期望返回原始数据,但将每个数据精确地放大 1000 倍!

我在这里放了一个完整的例子,我的 50 多行代码可以在最后找到。虽然我可以通过将每个结果除以OPTIMAL_SIZE(即 1000)的值来解决这个问题,但这个修复让我非常不安,不明白为什么。

请你能告诉我我做错了什么愚蠢的事情吗?

0 投票
1 回答
616 浏览

kissfft - 使用 C/ 中的倒谱概念和适当的输入麦克风进行 Kissfft 音高检测

我现在是音频信号处理的初学者我正在尝试实现音高检测算法我发现了倒谱的一些步骤

因此,我通过使用 Kissfft 和 portaudio 作为 FFT 和 IFFT 的库在 C 中实现这些算法。问题是在我得到 IFFT 结果并执行最后一步提取频率之后,结果不是我所期望的。(注。我通过在音符 A(440Hz)中唱歌来测试)

我不确定我是否错过了倒谱的最后一步,或者我做错了。

要测试的麦克风是我的笔记本电脑麦克风,我知道它是电容麦克风。我应该将麦克风更改为动态麦克风还是可以使用普通的 Labtop 麦克风

听到的是我一直在执行的代码

看待

0 投票
2 回答
1804 浏览

c++ - Kiss FFT 有多快?

主题问题:大 O 符号中的 Kiss FFT 有多快?我在任何地方都找不到这句话,它可能在某个地方很明显,我只是瞎了眼。

0 投票
3 回答
17978 浏览

c++ - 对音频样本应用 Kiss FFT 并获得 NaN 输出?

标题解释了我的问题。

我想做的很简单:

  • 加载 MP3 曲目(通过 libmpg123)
  • 阅读样本
  • 在样本上应用 Kiss FFT

到目前为止我尝试过的

问题出现在此行,kiss_fftr(config, (kiss_fft_scalar*) samples, spectrum); 其中samples包含音频样本(16 位),并spectrum假设保存输出数据。

函数完成后,调试器窗口中发生了以下情况。

http://i.stack.imgur.com/K5Wtd.png

有人能给我一个简单的例子,说明如何在音频(16 位编码)样本上应用 Kiss FFT 函数吗?