今天做信号与系统实验,有用到这部分的知识,感觉这里面道道很多,因此拿出来与大家分享一下。
首先,我们知道matlab是一个很好的编程环境(或许这种解释性语言算不上编程?)。总之用matlab对系统的仿真尤其是对数字信号的处理简单便捷。
今天做了一下傅里叶变换求系统响应这部分的实验。matlab工具箱提供了傅里叶变换的符号求解函数,而数值方法求解则通过傅里叶变换的基本定义来实现,详细如下:
dt = 0.01;
t = 0:dt:8;
et = exp(-3*t).*uCT(t); % 激励信号,其中uCT(t)是我自己写的单位阶跃函数
N = 2000;k = -N:N;w = pi*k/(N*dt);
fet = dt*et*exp(-1i*t'*w);
下面卖点来了,怎样用频域分析法求系统的零输入响应。
我左思右想怎么都觉得用符号法来实现不怎么靠谱。我们知道频域分析法主要体现了系统函数的功能,即幅度加权和相位修正。用符号法的话,怎么能改变’sym’里的幅度和相位呢?
这里就体现了数值法比符号法的优势了,数字信号处理大都使用数值法也是这样的原因:编程人员自由度高,可以做任意的合法操作。
既然确定用数值法来完成频域分析求零输入响应,那么,我们要实现的还是那两句话:幅度加权,相位修正。
先得到系统函数,matlab提供了函数freqs,详细参数自己查吧,这里不啰嗦了。
假设我们已经求出来了系统函数记为H。幅度加权就很简单了。
设激励信号为e(t),那么加权后即为e(t) * abs(H)。
难点还在相位修正。
我们知道有这样的公式:F (w) = |F(w)| * exp(j * Ψ(w))。于是我们可以先求出Ψ(w),在对相位函数进行相位修正Ψ1(w) = Ψ(w) + angle(H(w)),最后计算exp(j * Ψ1(w))。则经过幅度加权和相位修正后的F1(w) = |F1(w)| * Ψ1(w)。在此基础上进行傅里叶逆变换得到零状态响应r(t)。
fai = log(fet./abs(fet))/1i;
fai = fai + angle(H);
fet = abs(fet).*exp(1i.*fai);
frt = abs(H).*fet;
dw = pi/20;
rt = dw*frt*(exp(-1i*t'*w))'/2/pi;
希望本文对正在研究傅里叶变换的同学有帮助吧。