问题标签 [dft]

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 回答
656 浏览

c++ - 如何使用 cv::findcontours 和 DFT?它会导致调试错误

我正在做的是在预处理图像(通过阈值处理)后找到图像的轮廓。我想获得每个轮廓的离散傅里叶描述符(使用 dft() 函数)我的代码如下,

问题是什么???我找不到它..我认为函数的参数类型(例如 cv::finContours 或 dft )是错误的....

0 投票
1 回答
3513 浏览

c++ - OpenCV 并使用傅里叶变换 dft()

我正在尝试对两个单独的图像进行逐点乘傅立叶变换,然后转换回普通图像。我对在 OpenCV 中使用傅立叶变换不是很熟悉,但这就是我目前所拥有的。显示输出的最后一行导致“System.Runtime.InteropServices.SEHException”类型的异常,但我不知道如何修复它。我在每个阶段都尝试了各种不同的参数和函数,但似乎都给出了异常或空输出。我究竟做错了什么?感谢你给与我的帮助!

0 投票
1 回答
17486 浏览

python - numpy的fft结果的幅度要乘以采样周期?

我尝试用一​​个例子来验证我对 Numpy 的 FFT 的理解:傅里叶变换exp(-pi*t^2)应该是exp(-pi*f^2)在直接变换上没有应用缩放时。

但是,我发现要获得这个结果,我需要将 FFT 的结果乘以一个 factor dt,这是我的函数上两个采样点之间的时间间隔。我不明白为什么。有人可以帮忙吗?

这是一个示例代码:

0 投票
0 回答
339 浏览

matlab - DTMF,DFT窗口长度

我们在学校有一项任务是创建一个 DTMF 解码器,但无法理解需要做什么以及如何做。首先,我们需要使用卷积计算信号的能量。我们通过使用窗口长度和输入信号的绝对值来做到这一点:

现在,我们不知道如何获得合适的窗口长度。平滑后的能量用于对信号进行分段,然后使用基向量(?)确定信号中的不同频率。dtmf 脉冲至少有 40 毫秒,间隔至少 40 毫秒。采样频率为 8kHz,我们的信号长度约为 17601 个样本。我们认为通过 fs*0.04 我们可以得到窗口长度。0.04=40ms,但现在平滑的能量信号发生了偏移,因此这些段超出了输入信号的最大样本。

长话短说:我们如何计算“正确”的窗口长度?

提前致谢。

编辑:说明已更新,我们不应该使用卷积。我们应该使用 filter()

0 投票
1 回答
302 浏览

matlab - 向量化 5 个嵌套的 FOR 循环

我正在 MATLAB 中编写一个程序,作为我基于 DFT 的项目的一部分。

N x N数据矩阵为X,对应的 DFT 矩阵为Y,则 DFT 系数可表示为

由于旋转因子 WN 是周期性的,(1)可以表示为

对于给定的,指数((n1k1 +n2k2)) N = p由一组 满足。因此,通过对此类数据进行分组并应用 的属性,(n1,n2)(k1,k2)WN^(p+N /2) = -(WN^P)

(2)可以表示为

在哪里

我正在编写一个程序来查找Y(k1,k2,p)。即我需要从给定的 2D 方阵(即矩阵)创建 2D 矩阵的切片(即,每个切片都是 2D 矩阵的 3D 矩阵X).. 的维度X可以高达512.

基于上述方程,我编写了如下代码。我需要对其进行矢量化。

由于有 5 个 FOR 循环,对于 N 的大尺寸,执行时间非常长。因此,请为我提供消除 FOR 循环和矢量化代码的解决方案。我需要使代码以最大速度执行...谢谢再次..

0 投票
2 回答
18082 浏览

matlab - 图像的功率谱

我已经开始(一个小项目)来计算频域中图像的功率谱。

所以,到目前为止,我所拥有的是以下内容:

到目前为止,它看起来不错;我得到的网格图类似于我在各种学术论文中看到的光谱。

但是,我正在寻找的是这个功率谱与频率的关系图,我不完全确定如何获得这个频率向量。例如,我可以这样做:

但我不相信这是完全正确的,因为这会产生负频率。

如果有人能指出我正确的方向来绘制对数频率与功率谱的关系,我将不胜感激。

0 投票
1 回答
142 浏览

signal-processing - 如何在实际输出IFFT中节省一半的计算

实信号的 FFT 具有共轭对称性。该属性可用于节省一半的内存和一半的计算。这个实现非常简单,我已经做到了。

现在我想实现IFFT。这适用于共轭对称信号,并且预期为实信号。由于 IFFT 与具有反转符号旋转因子的 FFT 相同。有没有类似的方法可以节省一半的计算和内存?

0 投票
1 回答
954 浏览

opencv - OpenCV DFT_INVERSE 与 Matlab 的 ifft 不同

我尝试使用 opencv 的 dft 函数过滤信号。我尝试这样做的方法是在时域中获取信号:

使用以下方法将其转换为 FOURIER 域:

消除不需要的频率:

将其转换回时域:

为了检查我的结果,我将它们与 Matlab 进行了比较。我采用相同的信号 x,将其转换为 FOURIERx_mfft = fft(x);结果与我从 opencv 得到的结果相似,除了在 opencv 中我只得到左侧,而在 matlab 中我也得到对称值。在此之后,我在 Matlab 中将值设置为 0,x_mfft(0) and x_mfft(8:32)现在信号看起来完全相同,除了在 Matlab 中它们是复数形式,而在 opencv 中它们是分开的,实部在一个通道中,虚部在另一个通道中。

问题是,当我使用 matlab 执行逆变换时x_mfilt = ifft(x_mfft),结果与我使用 opencv 得到的完全不同。 MATLAB

cv::dft(x_fft, x_filt, cv::DFT_INVERSE, 0) 之后的 OpenCV;

频道 1:

频道 2:

我错过了什么?结果不应该相似吗?如何检查opencv中的逆变换是否正确完成?

后来的编辑:在解决了几个小时的问题后,我决定绘制 Matlab 和 OpenCV 的结果,令我惊讶的是,它们非常相似。

虚部 在此处输入图像描述

实物部分: 在此处输入图像描述

所以很明显,这是关于 SCALE 因素的。在将它们逐个元素划分之后,这个因子显然是 32 - 信号的长度。有人可以解释为什么会这样吗?显而易见的解决方案是使用cv::dft(x_fft, x_filt, cv::DFT_INVERSE+cv::DFT_SCALE, 0);,所以我想这个话题已经得到解答,但我仍然对为什么会这样感兴趣。

0 投票
1 回答
475 浏览

audio - 计算 STFT 的赫兹

这个问题主要与这个答案有关:如果@Paul R 有机会看到它,这将是理想的。

我有一个信号,我已经计算了一个 STFT。NFFT 的大小为 256,重叠为 128。这产生了 21 个包含输出的单独块。

因此,我想将其转换为赫兹,以查看信号中每个点的不同赫兹是什么。我使用以下公式计算了幅度:

这会产生以下结果:

在此处输入图像描述

我主要对下一部分的工作方式感到困惑。例如,我基本上有一个二维向量,其中包含来自 STFT 的所有块(每个块的大小为 256)。因此,我是否计算块内每个点的幅度,计算幅度的最高数字,然后使用公式freq = i_max * Fs / N

如果是这样,它看起来是否类似于以下内容(示例,不是实际数据):

然后,这将为每个 STFT 输出生成幅度矢量。从那里,我可以计算出哪个是最高的(比如说 7),然后我可以计算以下内容:

其中 44100 = 采样率,4 = STFT 块的大小。

然后这会给我每个块的频率。

这是正确的,还是我完全忽略了这一点?

0 投票
1 回答
436 浏览

matlab - 带 fft 的点积

根据卷积定理,时域中的卷积是 fft 域中的乘积。使用正确的零填充,它可以工作:

然而,这个定理也应该反过来起作用,时域中的乘积是 fft 域中的卷积。我没有得到这部分:

这给出了 d_bis 的复向量。如何使用频域中的卷积来反转时域中的逐点乘积?