问题标签 [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 回答
193 浏览

c++ - LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc

我一直在尝试在我的项目中使用 Kiss FFT。我在我的项目文件夹中克隆了这个存储库: https ://github.com/mborgerding/kissfft

我按照这个链接在我的项目中使用它:https ://github.com/berndporr/kiss-fft

我正在使用 Clion 来构建这个项目。我的代码如下:

}

CMakeLists.txt 为:

项目目录如下:

在此处输入图像描述

当我构建此代码时,我收到以下错误:

我已经使用 MSVC 和 MinGW(g++) 来编译这段代码,但在这两种情况下我都得到了同样的错误。

我该如何解决这个问题?

0 投票
1 回答
195 浏览

python - KISSFFT 中 2D 数组之间的元素乘法结果与 SciPy FFT 不同

在不鼓励使用FFTPACK 处理 2D arrays之后,我正在C ++中尝试使用KISSFFT

我编写了一个逐元素乘法函数,用于将两个二维数组转换为kiss_fftnd(). 然后用逆 FFT 函数将乘法的结果转换回来。不幸的是,我从C 语言中的Kissfft得到的结果与我在python中使用SciPy得到的结果不同,如下图所示:

在此处输入图像描述

为了测试乘法函数,为了简单起见,在转换 2D 输入数组之后,我将其与自身相乘。这是 Python 中的简化版本,用于说明该算法:

我想不出为什么这个简单的操作不能用Kissfft完成,这意味着我的乘法方法可能是错误的。由于输出kiss_fftnd()是一维数组而不是二维数组,因此我用来迭代该数组并执行逐元素乘法的逻辑可能不正确。

为什么这些结果不同,如何让 Kissfft 返回与 SciPy 相同的值?

如果您知道Kissfft中已经正确执行乘法的函数,那对我也有用。请不要建议其他图书馆来做这项工作。我正在寻找专门处理Kissfft的答案。

这是 Python 中的完整源代码:

这是 C++ 中的完整源代码:

0 投票
1 回答
112 浏览

c++ - 尝试使用 KissFFT 计算每个通道的幅度

我正在编写一个使用 SDL 和 KissFFT 的小程序,它应该打开一个波形文件,播放文件并找到当前采样缓冲区的每个通道的幅度和 dB,这样我就可以在屏幕上直观地显示左通道和右通道。

到目前为止,我已经打开并播放了该文件并编写了一个小函数,该函数将输入当前采样缓冲区并计算所提供缓冲区的幅度和 dB。

我对信号处理和 FFT 非常陌生,但基本概念应该是获取缓冲区,分配数组 IN/OUT。用样本填充 IN 数组并计算 FFT 并将输出存储在 OUT 中。

但据我了解,OUT 是一组频率(其中很多)。所以我现在想根据这些找到左右声道的幅度和dB。

这是我现在的代码

在这一点上,我有这个任意值,当使用 fill_rect 显示时看起来是正确的。但这只会给我一个价值。而且我很确定我在这里搞砸了很多事情。

如何将这些值分成 2 个通道?(我应该分别为每个通道计算 fft 吗?)。

0 投票
1 回答
57 浏览

c - 使用 Kiss_fft 将复频率转换为实信号

我正在尝试对我的复杂信号进行 FFT,并且输出应该是真实的。所以我制作了这段代码

但现在我遇到了函数kiss_fftr() 的问题。我应该使用 Kiss_fft() 吗?错误说 in 或 out 不是正确的类型,但在 Git-Hub 上它说应该这样。 https://github.com/berndporr/kiss-fft

0 投票
1 回答
866 浏览

c - dyld:未加载库:.....如何正确告诉GCC编译器在哪里可以找到另一个静态库?

我编写了 C 程序来计算波函数的时间步长迭代,以求解时间相关的薛定谔方程。在某些步骤中,我需要进行正向和反向快速傅里叶变换 (FFT),为此我使用了库Kissfft。(https://github.com/mborgerding/kissfft

我的程序结构有点像这样:

  • TDSE(工作目录)
    • 模块
    • 包括
    • 脚本
    • 测试
      • inttest_analytical.c
    • 亲吻
      • libkissfft-double.dylib

现在,当我编译inttest_analytical.c它时,它可以工作了。但是之后尝试运行可执行文件时,出现以下错误:

跑步后otool -L ./inttest_analytical我得到

据我在谷歌搜索的其他问题中阅读有关此内容的了解,libkissfft-double.dylib它是一个静态库,但我无法告诉 gcc 在哪里可以找到该库。它给出的路径(由编译器或链接器?)是工作目录 TDSE 而不是 TDSE/kissfft 对于编译我运行:

所以我想我使用的标志-L-l错误?

谢谢你的帮助。

0 投票
0 回答
89 浏览

fft - TI MSP430FR6989 上的吻 FFT

我正在尝试在 MSP430FR6989 Launchpad 上运行 Kiss FFT ( Kiss FFT github )。现在,我只是想让这里显示的 Kiss_fftr 测试正常工作。我遇到了kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem)的问题。我的输入是 (16, 0, NULL, NULL)。该函数在 Kiss_fftr.c 中到达这一点,然后由于 !st if 语句而返回 NULL。

Malloc 将 st 设置为 NULL,因此无法分配内存。我确信我的 MCU 中有足够的可用内存。我在 CCS 中的内存分配是 35% RAM (736/2048)、3% FRAM1 (1896/48000) 和 28% FRAM2 (23144/81912)。

有没有人有关于如何解决这个问题的建议,或者我应该学习什么来解决这个问题?如果内存分配不是问题,我不想追错兔子洞。

我试过的:当我尝试运行堆栈溢出链接中给出的测试代码并通过 UART 发送输出数组时,我没有得到任何输出。我通过创建一个会抛出 KISS_FFT_ERROR 的 if 语句 (st == NULL) 检查了kiss_fft_alloc 是否正常工作。错误发生在上面提到的点,但我无法弄清楚如何“修复” malloc 无法分配内存。

0 投票
0 回答
36 浏览

ios - 关于在 iOS swift 中实现 Kissfft

我需要使用来自录音的字节数组在我的 iOS 项目中计算 fft。我可以将 Kissfft 集成到我的项目中。根据计算fft的文档,我这样使用过。

在这里,我必须传递 'r' 和 'i' 值。但我不明白我必须通过什么价值观。你能帮我么。

在android中我使用DoubleFFt_1D java类的地方。

  for (int win = 0; win < windowSize; win++) { rowFFT[win * 2] = sample[win + time * (windowSize - overlay)] * windowing[win]; rowFFT[win * 2 + 1] = 0; }

任何人都可以请帮助我将不胜感激。

0 投票
1 回答
50 浏览

c - 在kiss_fft 中,为什么kf_bfly2 将数组作为参数?这个论点似乎是一个标量

Kiss_fft是一个非常简单的 FFT 实现;这几乎是教科书。它通过分解 FFT 大小将较大的 DFT 分解为重复的较小 FFT。它针对基数 2、3、4 和 5 优化了蝶形函数。

2,3 和 5 蝴蝶是小素数,通常在因式分解时发现,但 radix-4 蝴蝶是一种优化的情况,与使用 radix-2 两次*相比,它节省了一些乘法。例如,对于 32 点 FFT,大小 32 被分解为 4x4x2 - 两个阶段kf_bfly4后跟一个kf_bfly2

但是,这意味着您只能拥有一个kf_bfly2阶段。如果您的 FFT 大小是 4 的倍数,那么您将不会有两个kf_bfly2阶段,而是一个kf_bfly4阶段。这也意味着该kf_bfly2函数适用于长度为 1 的“数组”。

在代码中,声明是

其中Fout是一个大小为 的“数组” m,即始终为 1。蝶形循环结束Fout,编译器当然无法进行数值分析来证明这一点m==1。但由于这是最后一只蝴蝶,它经常被称为

Q1)我的分析正确吗?kf_bfly2确实是只用m==1?

Q2)假设这确实是一个错过的优化,有两种可能的方法。我们可以直接m从 中删除参数kf_bfly2,或者我们可以将因子分析更改为因子 32 为 2x4x4(向前移动kf_bfly2,对于大小为 4x4=16 的数组在顶层调用一次)。什么是最好的?

[*] radix-4 蝶形最终具有因子 +1、-1、+i 和 -i,它们可以被实现为加法和减法。请参阅为什么 Kiss_fft 的正向和反向 radix-4 计算不同?

0 投票
1 回答
43 浏览

c - 为什么kiss_fft 的正向和反向 radix-4 计算不同,第 2 部分?

第 1 部分 - 为什么下面的代码首先检查 st_inverse

Kiss_fft 代码在循环中有这个分支:

稍微重新排序:

这两个代码块的真正区别仅在于它们对m和的使用m3。但是m并且m3在循环内部没有改变。我可以通过交换m和简单地消除这个内循环分支m3吗?

0 投票
2 回答
76 浏览

c - 如何使用标量数组初始化带有标量成员的结构数组?

我知道标题令人困惑,但我不知道如何更好地描述它,让代码自己解释一下:

我有一个第三方库将复杂的标量定义为

所以复杂的数组/向量就像

目前的情况是,在一个函数中,我有两个浮点数组作为参数,我使用两个临时局部复杂数组,例如:

我注意到在第一个循环之后x没有用,第二个循环就位。如果我可以使用与和tmp_cpx_B相同的内存进行构建,我可以节省一半的中间内存使用量。xy

如果复数数组定义为

那么我可以简单地

做剩下的,但事实并非如此。

我不能更改第三个库复杂结构的定义,也不能cpx作为输入,因为我想向外部用户隐藏内部库而不破坏 API。

所以我想知道是否可以使用标量成员初始化结构数组,就像cpx标量数组x一样y

编辑1:对于一些常见的问题:

  1. 实际上,数组长度最多为 960,这意味着一个tmp_cpx数组将占用 7680 个字节。我的平台总共有 56k RAM,节省一个tmp_cpx将节省约 14% 的内存使用量。
  2. 第 3 方库是 KissFFt 并在复数数组上进行 FFT,它定义了自己的kiss_fft_cpx而不是标准的 <complex.h> 因为它可以使用 marco 在浮点/定点计算之间切换