MATLAB:傅里叶变换与我是我_lsim, 结果不匹配

信息处理 matlab fft 傅里叶变换 IFFT
2022-02-10 04:48:54

我的(简化的)问题:假设我有一个信号u,通过系统/过滤器G, 给出输出信号y. 然后我有一个定理说:

如果一个信号u(t), 傅里叶变换U(ejω)应用于系统G,然后是输出的傅里叶变换y(t)是(谁)给的:

Y(ejω)=G(ejω)U(ejω)

我尝试在 MATLAB 中验证这一点,但出现了问题。

执行:

  • U(ejω)使用 很容易获得fft(u)

  • 为了G(ejω)我使用freqresp(系统,ω) (并构建 ω以这样的方式,它与 fft 结果的格式相同:[dc positive-freqsnegative-freqs])。我通过将结果与波特图进行比较来验证这一点(请参阅脚本中的注释行)

为了验证我执行傅里叶逆变换y = ifft(Y)并比较获得的y(t)到 lsim 结果,这是通过yprime(t)= lsim(G,u)不幸的是,这些不匹配。我错过了什么?

clear 
close all

G = tf([4700 4393 3.245e08],[1 7.574 1.202e5 0 0]);

f_sh = 1000;                                    %sampling frequency

Gd = c2d(G,1/f_sh);                             %plant discretization

t_end = 10;                                     %[s] simulation time end
t = linspace(0,t_end,t_end*f_sh+1);               %time vector
f_ref = 0.5;                                    %reference freq
u = sin(2*pi*f_ref*t);                        %reference signal

L = length(u);
dF = f_sh/L;                                    %frequency bin step

w = dF:dF:f_sh/2;                               %one-sided frequency vector in Hz

w_eval = 2*pi*[0 w -fliplr(w)];                 %frequency vector for freqresp, formatted to match fft results

H = freqresp(Gd,w_eval);                        %frequency response of system wrt freq vec

H = transpose(squeeze(H));                      %remove singelton dimensions

% bode(Gd) %should be equal to the semilog plot
% figure
% semilogx(w,20*log10(abs(H(2:(L+1)/2))))             %plot in Hz   


U = fft(u);
Y = H.*U;
y = ifft(Y);                                    %frequency domain response

yprime = lsim(Gd,u);                              %simulation/time domain resonse

figure
plot(t,yprime,t,y)                           %y should equal yprime
legend('lsim response','fft(sys)*fft(ref) response')

lsim 结果似乎在其中有一些积分器效应???

1个回答

要正确执行 FFT 方法,您需要 FFT 长度至少为NU+NH1在哪里NU是长度uNH是长度h.

看起来像h是 IIR 滤波器,因此 FFT 方法可能效果不佳。

Mathworks 有一个很好的例子,比较了循环卷积和线性卷积。

IIR 滤波器最好在时域中实现。对于它们的规格,它们的阶数通常比 FIR 滤波器低得多,因此我们可以直接实现它们。