是否有任何 Java/Android 库已经实现了傅里叶逆变换?我发现有一些实现了傅立叶变换,但没有一个实现了其逆变换。
有人知道有关 Mayer FFT 实现的任何信息吗(我不必花大量时间来研究代码)?
我正在尝试执行卷积,并且 ifft 似乎产生了我所说的“镜像”输出。换句话说,我的内核+信号长度限制为 N/2,并且无论占用 n=0...N/2 ,都会镜像 n=N...N/2 。就负频率而言,它看起来有点像我对 FFT 的期望……只不过它就像负时间中的一面镜子。
这是我的卷积代码:
void convolve(struct cxType* data, struct cxType* kernel, int size)
{
int i,j;
int wrksz = size;
float gain = 1.0f/((float) wrksz);
mayer_fft(wrksz, data->re, data->im);
mayer_fft(wrksz, kernel->re, kernel->im);
for(i=0;i<wrksz;i++)
{
data->re[i]*=kernel->re[i]*gain;
data->im[i]*=kernel->im[i]*gain;
}
mayer_ifft(wrksz, data->re, data->im);
}
Run Code Online (Sandbox Code Playgroud)
使用 gnu Octave(对于不熟悉的人来说,MATLAB 语法等效)执行基本相同的操作会产生预期的结果,包括允许我在信号输出中占用 M+N-1:
fs=48000;
Ts = 1/fs;
NN = 1024
sincsz = floor(NN/4);
sigstart = floor(NN/16);
sigend = floor(NN/2);
dpi=2*pi;
%window func
tau=(1:sincsz)/sncsz;
window=0.5*(1.0 - cos(dpi*tau));
%plot(tau,window) …Run Code Online (Sandbox Code Playgroud) 我不是傅立叶分析专家,完全不明白 R 的函数 fft() 的作用。即使交叉阅读了很多之后我也无法弄清楚。我建立了一个例子。
require(ggplot2)
freq <- 200 #sample frequency in Hz
duration <- 3 # length of signal in seconds
#arbitrary sine wave
x <- seq(-4*pi,4*pi, length.out = freq*duration)
y <- sin(0.25*x) + sin(0.5*x) + sin(x)
Run Code Online (Sandbox Code Playgroud)
看起来像:

fourier <- fft(y)
#frequency "amounts" and associated frequencies
amo <- Mod(fft(y))
freqvec <- 1:length(amo)
Run Code Online (Sandbox Code Playgroud)
我假设 fft 期望在 1 秒的时间跨度内记录向量,因此我除以时间跨度
freqvec <- freqvec/duration
#and put this into a data.frame
df <- data.frame(freq = freqvec, ammount = amo)
Run Code Online (Sandbox Code Playgroud)
现在我可以/必须省略 data.frame 的后半部分,因为由于奈奎斯特的原因,频率“量”仅对采样率的一半有意义。
df <- …Run Code Online (Sandbox Code Playgroud) 我有一个时间信号,我计算其傅立叶变换以获得频率信号。根据帕塞瓦尔定理,两个信号具有相同的能量。我用Python成功演示了它。然而,当我计算频率信号的傅里叶逆变换时,能量不再守恒。这是我的代码:
import numpy as np
import numpy.fft as nf
import matplotlib.pyplot as plt
#create a gaussian as a temporal signal
x = np.linspace(-10.0,10.0,num=1000)
dx = x[1]-x[0]
sigma = 0.4
gx = (1.0/(2.0*np.pi*sigma**2.0)**0.5)*np.exp(-0.5*(x/sigma)**2.0)
#calculate the spacing of the frequencial signal
f=nf.fftshift(nf.fftfreq(1000,dx))
kk = f*(2.0*np.pi)
dk = kk[1]-kk[0]
#calculate the frequencial signal (FT)
#the convention used here allows to find the same energy
gkk = nf.fftshift(nf.fft(nf.fftshift(gx)))*(dx/(2.0*np.pi)**0.5)
#inverse FT
gx_ = nf.ifft(nf.ifftshift(gkk))*dk/(2 * np.pi)**0.5
#Parseval's theorem
print("Total energy in time domain = "+str(sum(abs(gx)**2.0)*dx)) …Run Code Online (Sandbox Code Playgroud) 此代码对信号进行 FFT 并将其绘制在新的频率轴上。
f=600;
Fs=6000;
t=0:1/Fs:0.3;
n=0:1:length(t);
x=cos(2*pi*(400/Fs)*n)+2*sin(2*pi*(1100/Fs)*n);
y=fft(x,512);
freqaxis=Fs*(linspace(-0.5,0.5, length(y)));
subplot(211)
plot(freqaxis,fftshift(abs(y)));
Run Code Online (Sandbox Code Playgroud)
我理解为什么我们使用它,fftshift因为我们希望看到以 0 Hz (DC) 值为中心的信号,这样更便于观察。
然而,我似乎对如何定义频率轴感到困惑。具体来说,为什么我们特别将[-0.5 0.5]的范围乘以Fs并得到 [-3000 3000]范围呢?它可能是[-0.25 0.25]。
我需要计算像这样存储的 2 个短数据数组的 FFT(重复数百万次):
等等。
数组值由黄色和蓝色表示。每个 K 值都有一个大小为 K 的未使用数据空间,我需要跳过。
我对数据进行了重新排序(和浮动转换)以消除无用的值,并使用 FFTW(带有 c)来计算所需的变换。
关于这个过程我有两个问题。
我使用这个库对音频文件进行 fft,之后我想用canvasjs可视化结果,但我不知道如何做到这一点。
我不确定应该使用什么 asx和yaxes。如果是频率和幅度,怎么办?最大x轴值应等于最大频率,如果是,则步长值是多少?(我计算了幅度和最大频率)。
如果有人能提供帮助,我将不胜感激。
编辑:我尝试重现这个,但我得到了以下结果。幅度并没有那么糟糕,但相位却很可怕。我认为这Math.atan2()将是问题所在,因为这是根据两个数字计算的,所以我尝试使用 Math.js 和数组,但得到了相同的结果。(链接中的预期结果)
for (var i = 0; i < 10 - 1/50; i+=1/50) {
realArray.push(Math.sin(2 * Math.PI * 15 * i) + Math.sin(2 * Math.PI * 20 * i));
}
//Phase
counter = 0;
for (var i = 0; i < realArray.length ; i++) {
rnd.push({x: i, y: (Math.atan2(imag[counter], realArray[counter]) * (180 / Math.PI))});
counter++;
}
//Magnitude
counter = 0 …Run Code Online (Sandbox Code Playgroud) 我需要将 HPF 和 LPF 应用于傅里叶图像并执行逆变换,然后比较它们。我执行以下算法,但没有结果:
img = cv2.imread('pic.png')
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
# need to add HPF and LPF
hpf = ...
lpf = ... # maybe 1 - hpf ?
# inverse
result = (lpf + (1 + alpha) * hpf)
Run Code Online (Sandbox Code Playgroud)
你能告诉我该怎么做吗?
Matlab/Octave 使用哪种方法conv2函数?
是吗:
我正在寻找最快的方法conv2。我将为它编写 C 代码。
我已经在Matlab中对时间序列波形执行了fft(快速傅里叶变换),但实际上我在傅里叶变换图中看起来有一个奇怪的波,尽管有这些波峰看起来像我希望只能在时域.是否有任何编程原因可能会发生这种情况?