傅里叶微分的差异 space
Discrepancy with differentiation in Fourier space
我正在使用 Matlab 求解傅立叶 space 中的微分方程。然而,我遇到了一个问题:在对我的真实信号进行微分后,我得到了复杂的答案(这是不正确的)。
考虑一个在 x
上微分的例子(在傅里叶 space 中乘以 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。但问题同源。
谢谢
我想你只是少了一个 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。
如果我知道如何在 SO 上使用希腊符号,我会的。但我想你明白我在说什么。
您需要考虑三件事:
- 时间微分对应于 将 DFT 乘以
1-exp(-1j*2*pi/N*fr)
,其中 N
是信号周期,fr = 0:N-1
是频率样本.这源于 DFT 的时移 属性(参见示例 here)。
- 这个微分应该是循环(见上文link),因为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
Luis Mendo 针对我的问题提出了正确的解决方案。我还想出了如何解决我的方法:认为正弦分量在高频上始终为零,只有余弦谐波是可见的:
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 例程
中使用 'symmetric' 选项
我正在使用 Matlab 求解傅立叶 space 中的微分方程。然而,我遇到了一个问题:在对我的真实信号进行微分后,我得到了复杂的答案(这是不正确的)。
考虑一个在 x
上微分的例子(在傅里叶 space 中乘以 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。但问题同源。
谢谢
我想你只是少了一个 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。
如果我知道如何在 SO 上使用希腊符号,我会的。但我想你明白我在说什么。
您需要考虑三件事:
- 时间微分对应于 将 DFT 乘以
1-exp(-1j*2*pi/N*fr)
,其中N
是信号周期,fr = 0:N-1
是频率样本.这源于 DFT 的时移 属性(参见示例 here)。 - 这个微分应该是循环(见上文link),因为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
Luis Mendo 针对我的问题提出了正确的解决方案。我还想出了如何解决我的方法:认为正弦分量在高频上始终为零,只有余弦谐波是可见的:
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 例程