傅里叶空间中差异的差异

时间:2016-11-21 19:30:47

标签: matlab signal-processing fft dft

我使用Matlab解决傅立叶空间中的微分方程。但是,我遇到了一个问题:在区分我的真实信号后,我得到了复杂的答案(这是不正确的)。

考虑一个在x上进行差异化的示例(在傅立叶空间中乘以ik):

 a=rand(6,1).';
 fr=fftshift(-3:1:2);
 ifft(1i*fr.*fft(a))

输出很复杂。我弄清楚它为什么会发生:我们的频谱是-3,-2,-1,0,1,2。因此,没有最高频率的对(我们有-3,但不要有3)。我想知道如何解决它。

如果我们考虑一下,从最高频率开始技术上的非零贡献。如果频率-3上的傅立叶振幅是c0,那意味着,实际上我们在频率-3和3上有振幅c0/2,因此在分化之后我们得到:

(c0/2)*i*(-k)*exp(-ikx)+(c0/2)*i*(k)*exp(ikx)=kc0*sin(kx)

我很好奇,如何实现正确的差异化。我的问题是2D,所以我使用fft2和ifft2。但问题起源不一。

由于

3 个答案:

答案 0 :(得分:2)

您需要考虑三件事:

  • 时间上的区分对应于将DFT 乘以1-exp(-1j*2*pi/N*fr),其中N是信号周期,fr = 0:N-1是频率样本。这源于DFT的时移属性(参见例如here)。
  • 这种区别应该是循环(见上面的链接),因为DFT固有地假设时间信号是周期性的。因此,时域中的第一个差异化样本将为a(1)-a(N),第二个将为a(2)-a(1)等。
  • 由于浮点精度,您可能会得到一个非常小的虚部。

所以,代码应该是:

a = rand(6,1).';
N = numel(a);
fr = 0:N-1;
a_diff_fr = ifft((1-exp(-1j*2*pi/N*fr)).*fft(a));

检查:

>> a_diff_fr % imag part should be small
a_diff_fr =
  Columns 1 through 5
  -0.5490 - 0.0000i   0.3169 - 0.0000i  -0.5662 + 0.0000i   0.6851 + 0.0000i  -0.5155 - 0.0000i
  Column 6
   0.6287 + 0.0000i

>> real(a_diff_fr) % real part only
ans =
   -0.5490    0.3169   -0.5662    0.6851   -0.5155    0.6287

>> a([1 2:N])-a([N 1:N-1]) % circular differentiation
ans =
   -0.5490    0.3169   -0.5662    0.6851   -0.5155    0.6287

答案 1 :(得分:1)

我认为你在那里错过了2 pi。这是一个使用x = 2 cos(2*pi*t)

的示例
Tp = 10; % sample length
deltaTime = Tp / 200; % time step
time = 0:deltaTime:Tp; % time
x = 2*cos(2*pi*time); % function
plot(time, x)
fMax = 1/deltaTime/2; % maximum frequency
fMin = 1/Tp; % lowest observable frequency
xfft = fft(x) ./ (length(time)/ 2); % fft scaled to original amplitude, in case you want to plot it.
freq = -1*fMax:fMin:fMax; % frequencies of the fft
xd_fft = xfft .* fftshift(freq) * 1i*2*pi; % note the extra 2 pi in here.
xd = ifft(xd_fft, 'symmetric') * (length(xd_fft)/ 2); % reverse the scaling and take the ifft.
xd2 = -4*pi*sin(2*pi*time);
plot(time, xd2, '.')

我这样做的等式是:

x(t)= Xe ^(iwt)和

x'(t)= iwXe ^(iwt)

回想一下w = 2 * pi * f。

如果我知道如何使用希腊符号我会的。但我认为你得到我所说的。

答案 2 :(得分:0)

路易斯·门多建议正确解决我的问题。我还想出了如何修复我的方法:思考是,高频上正弦波分量始终为零,只有余弦谐波可见:

signal=sin(2.*(linspace(0,2*pi*(1-1/4),4)));
q=fftshift(fft(signal))./4 

这里q为零。但如果用cos(2x)信号做的话:

signal=cos(2.*(linspace(0,2*pi*(1-1/4),4)));
q=fftshift(fft(signal))./4 

这里q(1)= 1。因此,在我的方法中,我必须在乘以ik之后将最高次谐波的虚部设置为0,只要正弦谐波是不可见的。正如马特建议的那样,人们可以简单地使用对称的对称' ifft例程中的选项