我正在使用 KissFFT 的 real 函数来转换一些真实的音频信号。我很困惑,因为我输入了带有 nfft 样本的真实信号,但结果是 nfft/2+1复数频率箱。
来自 KissFFT 的自述文件:
真正的(即不复杂)优化代码仅适用于偶数长度的 fft。它并行执行两个半长 FFT(打包为 real&imag),然后通过旋转将它们组合起来。结果是从 DC 到奈奎斯特的 nfft/2+1 复数频率档。
所以我不知道如何解释结果。我的假设是数据被打包成r[0]i[0]r[1]i[1]...r[nfft/2]i[nfft/2],其中 r[0] 是 DC,i[0] 是第一个频率仓,r[1] 是第二个频率仓,依此类推。是这样吗?
给定代码
function [nImg,mask] = myFunc(img,rl,rh)
[n m] = size(img);
mask = ones(n, m);
% do some stuff
% more
% and more
%
fourierImg = fft2(img); % take the fourier transform 2d for the given image
fourierImg = fftshift(fourierImg); % shift the fourier transform
output = mask.*fourierImg; % calc with the mask % THAT LINE CAUSES
% Warning: Displaying real part of complex input ?
ishifting = ifftshift(output); % grab the DC element
nImg = ifft2(ishifting); % inverse back to …Run Code Online (Sandbox Code Playgroud) 我正在使用 FFTW 高级数据布局 API 处理批量 2D FFT。
根据FFTW Advanced Complex DFT文档:
为 nembed 参数传递NULL相当于传递n。
inembed = onembed = NULL但是,在使用vs.时我得到了不同的结果inembed = onembed = n。什么可能导致结果不匹配?
让我们举个例子...
设置
int howMany = 2;
int nRows = 4;
int nCols = 4;
int n[2] = {nRows, nCols};
float* h_in = (float*)malloc(sizeof(float) * nRows*nCols*howMany);
for(int i=0; i<(nRows*nCols*howMany); i++){ //initialize h_in to [0 1 2 3 4 ...]
h_in[i] = (float)i;
printf("h_in[%d] = %f \n", i, h_in[i]); …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算并绘制随机信号的功率谱密度(PSD)。阅读的numpy 文档np.fft.fft,它提到 if A = fft(a)thennp.abs(A)是其幅度谱,np.abs(A)**2是其功率谱。
我的问题是,它是否负责对箱数等进行必要的划分(通常必须在 Matlab 中进行)以正确缩放?
例如,如果x我的原始信号以 V(伏特)为单位,我会这样做:
X = np.fft(x)
X = np.abs(X) #is that in Volts/Hz too?
#Do I have to divide by len(X) or anything else to scale it?
P = X**2 #is that in V^2/Hz? Do i have do do anything to scale it properly?
Run Code Online (Sandbox Code Playgroud)
我相信 numpy doc 可以对此进行更详细的阐述。在Matlab中我知道你必须自己处理它,但是在numpy中情况又如何呢?
WebAudio的AnalyserNode具有FFT来获取声音信号的频域数据。我不明白FFT的加窗函数是如何定义的。是否可以更改窗口大小甚至窗口函数(即汉宁或布莱克曼)?如果窗口不可调节,窗口大小是多少以及使用哪种窗口函数?
不幸的是我无法在文档中找到它。
我在我的图像和卷积核周围使用零填充,将它们转换为傅立叶域,然后将它们反转回来以获得卷积图像,请参见下面的代码。然而,结果是错误的。我期待一个模糊的图像,但输出是四个移位的四分之一。为什么输出错误,我该如何修复代码?
输入图像:

卷积结果:

from PIL import Image,ImageDraw,ImageOps,ImageFilter
import numpy as np
from scipy import fftpack
from copy import deepcopy
import imageio
## STEP 1 ##
im1=Image.open("pika.jpeg")
im1=ImageOps.grayscale(im1)
im1.show()
print("s",im1.size)
## working on this image array
im_W=np.array(im1).T
print("before",im_W.shape)
if(im_W.shape[0]%2==0):
im_W=np.pad(im_W, ((1,0),(0,0)), 'constant')
if(im_W.shape[1]%2==0):
im_W=np.pad(im_W, ((0,0),(1,0)), 'constant')
print("after",im_W.shape)
Boxblur=np.array([[1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]])
dim=Boxblur.shape[0]
##padding before frequency domain multipication
pad_size=(Boxblur.shape[0]-1)/2
pad_size=int(pad_size)
##padded the image(starts here)
p_im=np.pad(im_W, ((pad_size,pad_size),(pad_size,pad_size)), 'constant')
t_b=(p_im.shape[0]-dim)/2
l_r=(p_im.shape[1]-dim)/2
t_b=int(t_b)
l_r=int(l_r)
##padded the image(ends here)
## padded the kernel(starts here)
k_im=np.pad(Boxblur, ((t_b,t_b),(l_r,l_r)), 'constant')
print("hjhj",k_im)
print("kernel",k_im.shape) …Run Code Online (Sandbox Code Playgroud) 在苹果文档上,它说
我们建议您使用 DFT 例程而不是这些例程。
或者
尽可能使用 DFT 例程而不是这些例程。(例如,而不是调用vDSP_fft_zip与vDSP_create_fftsetup创造了一个建立,呼叫vDSP_DFT_Execute( ::: :_ :)与vDSP_DFT_zop_CreateSetup(创建的设置::_ :))。
使用 DFT 例程有什么好处?
我应该如何使用 Accelerate 框架在 iOS 上的 Swift 中计算真实信号的 FFT?
Apple 的 Accelerate 框架似乎提供了有效计算信号 FFT 的功能。
不幸的是,Internet 上可用的大多数示例(如Swift-FFT-Example和TempiFFT )在进行广泛测试并调用 Objective C API 时会崩溃。
在苹果文档回答了许多问题,但也导致了一些人(这是一块强制?为什么我需要这个调用转换?)。
很少有线程通过具体示例来解决 FFT 的各个方面。值得注意的是,在 Swift 中使用 Accelerate 的 FFT,Swift中的DFT 结果与 MATLAB和FFT 计算错误 - Swift 的结果不同。他们都没有直接解决“从 0 开始做这件事的正确方法是什么”的问题?
我花了一天时间才弄清楚如何正确地做到这一点,所以我希望这个帖子可以清楚地解释您应该如何使用 Apple 的 FFT,展示要避免的陷阱,并帮助开发人员节省宝贵的时间时间。
当使用librosa.stft()计算频谱,一个人如何找回相关的频率值?我对生成图像不感兴趣librosa.display.specshow,但我想掌握这些值。
y, sr = librosa.load('../recordings/high_pitch.m4a')
stft = librosa.stft(y, n_fft=256, window=sig.windows.hamming)
spec = np.abs(stft)
Run Code Online (Sandbox Code Playgroud)
spec给我每个频率的“幅度”或“功率”,但不是频率箱本身。我已经看到有一个display.specshow函数可以在热图的垂直轴上显示这些频率值,但不返回值本身。
我正在寻找类似于nn.fft.fttfreq()单个 FFT 的东西,但在librosa文档中找不到它的等价物。
问题:给定一个已排序的数组 A,找出 A 中元素的所有可能差异,其中每个元素都是 [1, ..., n] 范围内的整数。此外,您可以假设没有重复项。所以数组的最大大小将 <= n。
注意:由于上述限制,可能的总差异将在 [1, ..., n-1] 的范围内。
示例(对于 N=12):
输入:1、6、10、12
输出:2、4、5、6、9、11
问题与此类似,除了 n 是否。该问题中的元素数量,而不是元素的上限。
在同一个问题中也有一个答案,这个:https : //stackoverflow.com/a/8455336/2109808 这家伙声称它确实可以使用 fft 和自卷积在 O(nlogn) 中完成,但我不明白它,当我在在线卷积计算器上尝试它时,它似乎也不正确(就像这个)。
那么,有谁知道如何在 O(nlogn) 中实现这一点?
先感谢您 :)