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

c++ - FFTW 的 fftw_plan_dft_r2c_1d() 在 KissFFT 中的等效函数是什么?

我有一个使用fftw_plan_dft_r2c_1dfftw_plan_dft_c2r_1d来自 FFTW 的项目,以及fftw_execute. KissFFT 中的等价函数是什么?

0 投票
2 回答
6666 浏览

signal-processing - Kissfft 缩放

我希望使用 FFT 和 Kissfft 库计算快速相关性,并且缩放需要精确。什么缩放是必要的(向前和向后),我用什么值来缩放我的数据?

0 投票
3 回答
2014 浏览

android - 在android中使用native C Kiss_fft.c计算fft

我的目标是编译 Kiss_fft 库以在 JNI 中用于 android 开发。然而,首先,我试图在我的 linux 机器上用 C 语言使用 Kiss_fft 库。

当使用 Kiss_fft ( Kissfft ) 中的 Kiss_fft.c 或 Kiss_fftr.c 计算 DFT 时。您究竟如何将他们的库编译到您自己的文件中。在我的源 C 文件的顶部,我#include Kiss_fft.h 和#include Kiss_fftr.h,并将 Kiss_fft 源代码放在我的项目根目录或 /usr/include/ 中,然后我编译makefile 类似于这个:

查看所有的kiss_fft 源文件,我编写了这个make 文件来构建所有依赖项。但是我仍然得到

undefined reference to kiss_fft

undefined reference to kiss_fft_alloc

哪些是 Kiss_fft 库的内部函数。

任何帮助,将不胜感激。谢谢

0 投票
2 回答
2316 浏览

fft - 吻 FFT bin 幅度

我花了很多时间研究 FFT。我对使用 KISSFFT 特别感兴趣,因为它是一个非常便携的 C 实现。

我仍然不清楚如何将 i[x] 和 r[x] 转换为频率仓的幅度。所以创建了一个有符号的 int 16 版本的 sin。我有 512 个正弦波样本。我希望看到一个带有数据的 Bin,而其余的则为零。不是这样...

这是我的代码...

}

我得到的结果看起来像这样......

0 投票
1 回答
3433 浏览

image-processing - FFT 卷积 - 如何应用内核

我对图像处理很陌生,发现 FFT 卷积可以大大加快大内核大小的卷积。

我的问题是,如何在使用 KissFFT 时将内核应用于频率空间中的图像?

我已经做了以下事情:

当我在图像上再次设置 rgb 值时,我确实得到了原始图像。所以转换工作。如果我想应用内核,例如 9x9 框模糊(1/9、1/9、... 1/9),我现在应该怎么做。

我已经阅读了一些关于快速卷积的内容,但它们都是不同的,具体取决于 FFT 的实现。在应用过滤器之前,是否有一种“列表”我必须关心的事情?

我认为的方式:

图像大小必须是 2 的幂;我必须创建一个与图像大小相同的内核。将 9 个中间值设置为 1/9,其余设置为 0,然后将此内核转换为频域,将源图像与它相乘,然后将源图像转换回来。但这并没有真正起作用:DD

0 投票
2 回答
3679 浏览

c++ - FFT 问题的高斯模糊

我有一个使用常规卷积的当前高斯模糊实现。它对于小内核来说足够高效,但是一旦内核大小变大一点,性能就会受到影响。所以,我正在考虑使用 FFT 实现卷积。我从来没有任何与 FFT 相关的图像处理的经验,所以我有几个问题。

  1. 基于 2D FFT 的卷积是否也可以分成两个 1D 卷积?

    • 如果是真的,它是这样的吗 - 每行的 1D FFT,然后每列的 1D FFT,然后乘以 2D 内核,然后每列的逆变换和每行的逆变换?或者我是否必须在每次一维 FFT 变换后乘以一维内核?
  2. 现在我明白内核大小应该与图像大小相同(一维的情况下为行)。但它将如何影响边缘?我必须用零填充图像边缘吗?如果是这样,内核大小应该等于填充之前或之后的图像大小?

另外,这是一个 C++ 项目,我打算使用 KissFFT,因为这是一个商业项目。欢迎您提出任何更好的替代方案。谢谢你。

编辑:感谢您的回复,但我还有一些问题。

  1. 我看到输入图像的虚部将全为零。但是输出虚部也会为零吗?我是否必须将高斯核乘以实部和虚部?

  2. 我有相同图像的实例以不同的比例模糊,即相同的图像被缩放到不同的大小并在不同的内核大小下模糊。每次缩放图像时都必须执行 FFT,还是可以使用相同的 FFT?

  3. 最后,如果我想可视化 FFT,我知道必须将日志过滤器应用于 FFT。但是我真的迷失了应该使用哪个部分来可视化 FFT?实部或虚部。

  4. 同样对于大小为 512x512 的图像,实部和虚部的大小是多少。它们的长度会一样吗?

再次感谢您的详细回复。

0 投票
2 回答
1163 浏览

image-processing - FFT 卷积 - 非常低的 PSNR

我正在用 FFT 滤波器(内核大小 = 10)对图像(512*512)进行卷积,看起来不错。

但是当我将它与我以正常方式进行复杂处理的图像进行比较时,结果是可怕的。
PSNR 约为 35。

67,187/262,144 像素值相差 1 或更多(峰值约为 8)(最大像素值为 255)。

我的问题是,在频率空间中进行卷积时是否正常,或者我的卷积/变换函数可能存在问题?. 因为奇怪的是,当我使用 double 作为数据类型时,我应该得到更好的结果。但它完全一样。

当我将图像转换为频率空间时,不要对其进行卷积,然后将其转换回来就可以了,使用浮点数时 PSNR 约为 140。

此外,由于像素差异只有 1-10,我想我可以排除缩放错误

编辑:无聊感兴趣的人的更多详细信息

我使用开源的 KissFFT 库。使用真正的二维输入 (kiss_fftndr.h)

我的图像数据类型是 PixelMatrix。简单的 alpha、red、green 和 blue 值从 0.0 到 1.0 float 的矩阵

我的内核也是一个 PixelMatrix。

这是卷积函数的一些片段

使用的数据类型:

FFT的配置:

填充和转换内核:

将颜色放入数组:

卷积:

我们现在拥有的:

  • 3个来自kiss_fft_cpx类型的转换颜色数组*
  • 1个来自kiss_fft_cpx类型的转换内核数组*

它们都是复杂的数组

现在是卷积:

现在我将它们转换回来:

笔记:

  • 我已经提前注意图像的大小为 2 (256*256)、(512*512) 等的幂。

例子:

内核大小:10

输入:

输出:

正常卷积的输出:

我的控制台说:

虽然在我看来它们看起来是一样的°.°

也许一个人很无聊,并通过代码。不是很紧急,但这是一种问题我只是想知道我到底做错了什么^^

最后但并非最不重要的一点是我的 PSNR 功能,虽然我并不认为这是问题所在:D

0 投票
2 回答
6091 浏览

fft - 如何解释 KissFFT 的 Kiss_fftr(实信号的 FFT)函数的结果

我正在使用 KissFFT 的真实功能来转换一些真实的音频信号。我很困惑,因为我输入了一个带有 nfft 样本的真实信号,但结果是 nfft/2+1复数频率区间。

来自 KissFFT 的自述文件:

真正的(即不复杂的)优化代码只适用于偶数长度的ffts。它并行执行两个半长 FFT(打包成 real&imag),然后通过 twiddling 组合它们。结果是从 DC 到 Nyquist 的 nfft/2+1 个复频率区间。

所以我对如何解释结果没有具体的了解。我的假设是数据像 一样打包r[0]i[0]r[1]i[1]...r[nfft/2]i[nfft/2],其中 r[0] 是 DC,i[0] 是第一个频点,r[1] 是第二个,依此类推。是这样吗?

0 投票
1 回答
2611 浏览

c++ - 如何执行 FFT2D(Fast Fourier Transform 2D)R、G、B 颜色分量

我是快速傅立叶变换 (FFT) 的新手,对它如何用 C++ 等编程语言计算并没有太多了解。这是FFT2D的方法

提示:图像像素存储为三个独立的图像颜色(R、G、B)平面,每个平面都由复数的一维数组表示。假设图像的大小为宽 W 高 H,则图像位置 (m, n) 处像素的颜色分量值 (R, G 和 B) 可以找到为 R[m + n * W], G( m + n * W) 和 B[m + n * W],其中 R、G、B 是三个复数数组。变换系数的一维数组也以相同的方式表示。

我只需要实现一种颜色分量的处理,编程模板将根据实现的功能分别处理R、G、B。该模板还将用零填充图像,以便每个输入图像的大小为 2m * 2n。

FFT1D 从 FFT2D 的函数内部调用。我在 C、C++、Java 和 C#of FFT2D 中发现了几种不同类型的代码。他们中的大多数都使用二维数组结构来实现;他们将实部和虚部分配给行和列循环中的二维数组结构。但是,在我的例子中是颜色分量的一维数组结构。

让我们做一些代码,这是在 FFT2D 函数中:

之前,调用 FFTID,还需要计算一个 twoK 的值,如书中的,M = 2K

如果您有任何想法或任何参考,请告诉我。

谢谢

问候一郎

0 投票
2 回答
5632 浏览

plot - 为什么我的 KISS FFT 图显示在 y 轴上镜像的重复峰?

我是 FFT 概念的初学者,所以我的理解是,如果我输入 1024 个信号,我将得到 513 个从 0hz 到 22050Hz 的 bin(在 44100Hz 采样率的情况下)。在 Cinder 中使用 KISS FFT,getBinSize 函数返回 1024 个信号输入的预期 513 个值。我不明白为什么会出现重复的峰。运行一个经过 20Hz 到 22000Hz 频率(按顺序)的测试音频样本,我一直看到两个峰值。它看起来像:

__ _ __ |__ _ __ _ __ |_ _ __

随着音频的播放,峰似乎相互靠近,因此第二个峰确实似乎是第一个峰的镜像副本。我经历过的每个示例似乎都只是继续绘制所有 513 值,而且它们似乎没有这个镜像问题。我不确定我错过了什么。