我是否只是嵌套他们(iff(fft(audio)))或逐个窗口(window音频,做fft,做ifft,然后反转窗口,用eps替换零,然后合并样本(abs在管道中尝试这里和那里))我只得到噪音.
我知道这ifft只是fft与无限精度算术,无限多个样本等相反(对吗?)我正在使用64位浮点和44kHZ采样率.但是,我希望能够至少听到原始音频.
我的错误是实践还是理论?我可以给代码,如果它是一个错误.
我试图从Trucco/Verri文本"3D计算机视觉的入门技术"中看到的着色算法重建经典形状,但我很难理解matlab中的fft函数.基本上,我需要使用可积性约束来获得图像的深度(Z).在这种情况下,我不确定何时使用fftshift.这是我到目前为止的代码.基于http://www.mathworks.com/matlabcentral/newsreader/view_thread/285244 我基本上将所有的fft2都包裹在fftshifts中,但我不认为这是正确的用法.有人可以向我解释一下使用情况以及我做错了什么吗?谢谢.基本上,我试图将我的p和q(基于像素强度的更新值)转换为傅里叶域,以便在方程C中使用它们.然后我想将方程C转换回时域因为那会给我Z的深度.我还想根据傅里叶域中的C更新P和Q.
wx = (2.* pi .* x) ./ m;
wy = (2.* pi .* y) ./ n;
wx = ifftshift(wx); wy=ifftshift(wy);
Cp = fftshift(fft2(fftshift(p)));
Cq = fftshift(fft2(fftshift(q)));
C = -1i.*(wx .* Cp + wy .* Cq)./(wx.^2 + wy.^2);
Z = abs((ifft2(ifftshift(C))));
p = ifftshift(ifft2(ifftshift(1i * wx .* C)));
q = ifftshift(ifft2(ifftshift(1i * wy .* C)));
Run Code Online (Sandbox Code Playgroud) 根据卷积定理,时域中的卷积是fft域中的乘积。通过正确的零填充,它可以工作:
% convolution in time domain
a = [1 2 3];
b = [4 5 6];
c = conv(a,b);
a_padded=[a 0 0]; b_padded=[b 0 0];
c_bis=ifft(fft(a_padded).*fft(b_padded));
% we do find c_bis=c
Run Code Online (Sandbox Code Playgroud)
然而,这个定理也应该以相反的方式工作,时域中的乘积是 fft 域中的卷积。我不明白这部分:
d = a.*b;
D=conv(fft(a_padded),fft(b_padded));
d_bis=ifft(D);
Run Code Online (Sandbox Code Playgroud)
这给出了 d_bis 的复向量。如何使用频域中的卷积来反转时域中的逐点乘积?
给定代码
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) 我不明白为什么ifft(fft(myFunction))和我的函数不一样.它似乎是相同的形状,但是2的因子(忽略常数y偏移).我可以看到的所有文档都说fft没有做一些规范化,但ifft应该照顾它.下面是一些示例代码 - 你可以看到我已经提到了2的因素给了我正确的答案.谢谢你的帮助 - 它让我疯狂.
import numpy as np
import scipy.fftpack as fftp
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
def fourier_series(x, y, wn, n=None):
# get FFT
myfft = fftp.fft(y, n)
# kill higher freqs above wavenumber wn
myfft[wn:] = 0
# make new series
y2 = fftp.ifft(myfft).real
# find constant y offset
myfft[1:]=0
c = fftp.ifft(myfft)[0]
# remove c, apply factor of 2 and re apply c
y2 = (y2-c)*2 + c
plt.figure(num=None)
plt.plot(x, y, x, y2) …Run Code Online (Sandbox Code Playgroud) 我有一个用于计算方波的傅里叶变换的小脚本,它可以很好地工作并在我反转fft使用时正确返回方波numpy.fft.ifft().但是,我无法通过手动累加谐波来将它们乘以它们各自的系数,我从numpy.fft.fft()下面得到的是我的脚本,我相信你会看到我的意图.
from numpy import zeros, concatenate, sin, pi, linspace
from numpy.fft import fft, fftfreq, ifft
import numpy as np
import matplotlib.pyplot as plt
N = 1024 # samples
T = 1 # period
dt = T/N # sampling period
fs = 1/dt # sampling frequency
t = linspace(0, T, N) # time points
functime = .... # square wave
funcfft = fft(functime) # fft
fftcoeffs = np.abs(funcfft)/N # coefficients, divide by N to get …Run Code Online (Sandbox Code Playgroud) 在numpy,我们有以下功能:
import numpy
from numpy.fft import fft2, ifft2, fftshift, ifftshift
Run Code Online (Sandbox Code Playgroud)
我想重写这些功能在河fft中的R作品一样fft或fft2Python编写的.同样ifft2,我们必须这样做fft(,inverse=T)
现在我想知道如何在R中有效地重写fftshift和ifftshift函数(对于矩阵).
我正在测试Matlab中FFT和IFFT函数的有效性.
我可以将这些函数的输出与一个众所周知的数学事实进行比较:偶数,实数函数的傅里叶变换(如以0为中心的高斯),是另一个偶数,实数函数(FFT [真实,0居中高斯] =真实,0居中的高斯).这个事实应该适用于FFT和IFFT.
首先我制作网格:
nx = 256; % grid total pixel count
X = 500; % grid size (um)
dx = X/nx; % grid spacing (um)
x = linspace(-nx/2,nx/2-1,nx)*dx; % x grid (um)
df = 1/(nx*dx); % spectral grid spacing (1/um)
f = linspace(-nx/2,nx/2-1,nx)*df; % f grid (1/um)
Run Code Online (Sandbox Code Playgroud)
我制作了高斯:
A = 1; % magnitude (arbitrary units)
x_fwhm = 7; % Full width at half maximum diameter (um)
x0 = x_fwhm/sqrt(2*log(2)); % 1/e^2 radius (um)
y = A*exp(-2*x.^2./(x0)^2); % Gaussian …Run Code Online (Sandbox Code Playgroud) 我以递归模式实现了两个函数 FFT 和 InverseFFT。
这些是功能:
def rfft(a):
n = a.size
if n == 1:
return a
i = 1j
w_n = e ** (-2 * i * pi / float(n))
w = 1
a_0 = np.zeros(int(math.ceil(n / 2.0)), dtype=np.complex_)
a_1 = np.zeros(n / 2, dtype=np.complex_)
for index in range(0, n):
if index % 2 == 0:
a_0[index / 2] = a[index]
else:
a_1[index / 2] = a[index]
y_0 = rfft(a_0)
y_1 = rfft(a_1)
y = np.zeros(n, dtype=np.complex_)
for k in …Run Code Online (Sandbox Code Playgroud) 我有在相关点具有等效间隔和相应测量值的数据。例如,这是我拥有的数据的摘录:
y =[2.118, 2.1289, 2.1374, 2.1458, 2.1542, 2.1615, 2.1627, 2.165 2.1687...]
点之间的间隔为 0.1
所以,我需要从数据中获取的是幅度谱(幅度与频率)和相位谱(相位角与频率)。此外,我应该将数据的相位偏移负 90 度 (-pi/2)。
在移动相位并保持幅度不变时,我需要执行逆 fft 并获得新信号。我想在 Python 中做到这一点。
你能给我一个执行此操作的示例吗?
我使用的代码取自另一个 SO 问题,但我做了一些修改
## Perform FFT WITH SCIPY
signalFFT = np.fft.fft(y)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
signalPhase = np.angle(signalFFT)
## Shift the phase py +90 degrees
new_signalPhase =(180/np.pi)*np.angle(signalFFT)+90
## Get frequencies corresponding to signal
fftFreq = np.fft.fftfreq(len(signalPSD), 0.1)
## Get positive half of frequencies
i = fftFreq>0
##
plt.figurefigsize=(8,4)
#plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
plt.plot(fftFreq[i], …Run Code Online (Sandbox Code Playgroud)