实信号逆 FFT 后的复数输出

信息处理 matlab 傅里叶变换 去噪 反卷积
2022-02-20 01:37:31

我有一个真实的一维信号 s(流通池中的吸光度),在执行SSo. 基本上 fft(S) 除以 fft(So)。让我们将输出称为R向量。为了去除周期性噪声,我将噪声区域替换为R0+0i 在给定范围内。IFFT(R) 很复杂。当我绘制 t 和 ifft(R),MATLAB 警告说复数 R 参数的虚部被忽略。输出看起来符合要求,没有噪音。

论坛成员提到这可能是由于数值精度引起的,但是 ifft(R) 大约为 0.0006i。

在频域中是否有比这个矩形窗口更好的窗口(简单的一个)?

即使在这个可以测试的更简单的示例中,即使是更简单的代码,也会生成复杂的逆输出。

t = [0:1/80:60]'; % Time
x = sin(2 * pi * 2 * t) + sin(2 * pi * 0.05 * t); % Signal
X = fft(x);
X([1:6, 4780:4801]) = 0; % Removing low frequency 0.05 Hz
z = ifft(X); % **z turns out to be complex as well**
figure(1)
plot(t, z)
hold on
figure(2)
plot (abs(X))

谢谢。

1个回答

本质上,您的代码不尊重 FFT 输出的固有 Hermitian 对称性。在这里,你的信号是奇数2K+1. 因此,这个 FFT 产生一个系数的复向量d(真实的)和ak(一般复杂),排列为:

[d,a1,a2,,aK,aK¯,,,a2¯,a1¯]

如果要将某些系数归零,则应通过共轭对删除 then (除了d), 像

[0,0,a2,,aK,aK¯,,,a2¯,0].

注意:对于偶数尺寸,实系数nK+1插入之间aKaK¯.

您的线路:

X([1:6, 4780:4801]) = 0

不满足这种对称性。试试这个(仅对奇数长度有效):

nACBin = 3;
X([1:nACBin+1, end-nACBin+1:end]) = 0; % 

你会得到一个低得多的假想残差(这里是由于数字问题)。在这里,由于非常简单的上下文(两个具有幸运间隔长度的正弦),它以某种方式起作用(见下文),但通常很少推荐这样做:

正弦信号和矩形窗口傅里叶滤波

尤其是在短步幅为 0 的情况下,这会将您的数据与基数正弦进行卷积,无论是宽的还是摆动的。

正如评论中所说,您正在考虑使用 windows 在频域中对滤波器进行原型设计。这是 DSP 中一个覆盖面广的领域。但是,您可以通过首先查看已经具有良好设计实现的时域过滤(Butterworth、Chebyshev、Cauer、Papoulis 过滤器)来避免这些复杂性。其他滤波器可用于峰值,如多项式插值器(例如 Savitzky-Golay)。

旁注:将这些频率约束嵌入到反卷积中可能会更有效(虽然有点复杂),而不是之后尝试去除伪影。