(2) fft(X,N):计算N点离散傅立叶变换。它限定向量的长度为N,若X的长度小于N,则不足部分补上零;若大于N,则删去超出N的那些元素。对于矩阵X,它同样应用于矩阵的每一列,只是限定了向量的长度为N。
(3) fft(X,[],dim)或fft(X,N,dim):这是对于矩阵而言的函数调用格式,前者的功能与FFT(X)基本相同,而后者则与FFT(X,N)基本相同。只是当参数dim=1时,该函数作用于X的每一列;当dim=2时,则作用于X的每一行。
值得一提的是,当已知给出的样本数N0不是2的幂次时,可以取一个N使它大于N0且是2的幂次,然后利用函数格式fft(X,N)或fft(X,N,dim)便可进行快速傅立叶变换。这样,计算速度将大大加快。
相应地,一维离散傅立叶逆变换函数是ifft。ifft(F)返回F的一维离散傅立叶逆变换;ifft(F,N)为N点逆变换;ifft(F,[],dim)或ifft(F,N,dim)则由N或dim确定逆变换的点数或操作方向。
例6-15 给定数学函数
x(t)=12sin(2π×10t+π/4)+5cos(2π×40t)
取N=128,试对t从0~1秒采样,用fft作快速傅立叶变换,绘制相应的振幅-频率图。
在0~1秒时间范围内采样128点,从而可以确定采样周期和采样频率。由于离散傅立叶变换时的下标应是从0到N-1,故在实际应用时下标应该前移1。又考虑到对离散傅立叶变换来说,其振幅| F(k)|是关于N/2对称的,故只须使k从0到N/2即可。
程序如下:
N=128; % 采样点数
T=1; % 采样时间终点
t=linspace(0,T,N); % 给出N个采样时间ti(I=1:N)
x=12*sin(2*pi*10*t+pi/4)+5*cos(2*pi*40*t); % 求各采样点样本值x
dt=t(2)-t(1); % 采样周期
f=1/dt; % 采样频率(Hz)
X=fft(x); % 计算x的快速傅立叶变换X
F=X(1:N/2+1); % F(k)=X(k)(k=1:N/2+1)
f=f*(0:N/2)/N; % 使频率轴f从零开始
plot(f,abs(F),'-*') % 绘制振幅-频率图
xlabel('Frequency');
ylabel('|F(k)|')
6.5 多项式计算
6.5.1 多项式的四则运算
1.多项式的加减运算
2.多项式乘法运算
函数conv(P1,P2)用于求多项式P1和P2的乘积。这里,P1、P2是两个多项式系数向量。
例6-16 求多项式x4+8x3-10与多项式2x2-x+3的乘积。
3.多项式除法
函数[Q,r]=deconv(P1,P2)用于对多项式P1和P2作除法运算。其中Q返回多项式P1除以P2的商式,r返回P1除以P2的余式。这里,Q和r仍是多项式系数向量。
deconv是conv的逆函数,即有P1=conv(P2,Q)+r。
例6-17 求多项式x4+8x3-10除以多项式2x2-x+3的结果。
6.5.2 多项式的导函数
对多项式求导数的函数是:
p=polyder(P):求多项式P的导函数
p=polyder(P,Q):求P·Q的导函数
[p,q]=polyder(P,Q):求P/Q的导函数,导函数的分子存入p,分母存入q。
上述函数中,参数P,Q是多项式的向量表示,结果p,q也是多项式的向量表示。
例6-18 求有理分式的导数。
命令如下:
P=[1];
Q=[1,0,5];
[p,q]=polyder(P,Q)
6.5.3 多项式的求值
MATLAB提供了两种求多项式值的函数:polyval与polyvalm,它们的输入参数均为多项式系数向量P和自变量x。两者的区别在于前者是代数多项式求值,而后者是矩阵多项式求值。
1.代数多项式求值
polyval函数用来求代数多项式的值,其调用格式为:
Y=polyval(P,x)
若x为一数值,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵中的每个元素求其多项式的值。
例6-19 已知多项式x4+8x3-10,分别取x=1.2和一个2×3矩阵为自变量计算该多项式的值。
2.矩阵多项式求值
polyvalm函数用来求矩阵多项式的值,其调用格式与polyval相同,但含义不同。polyvalm函数要求x为方阵,它以方阵为自变量求多项式的值。设A为方阵,P代表多项式x3-5x2+8,那么polyvalm(P,A)的含义是:
A*A*A-5*A*A+8*eye(size(A))
而polyval(P,A)的含义是:
A.*A.*A-5*A.*A+8*ones(size(A))
例6-20 仍以多项式x4+8x3-10为例,取一个2×2矩阵为自变量分别用polyval和polyvalm计算该多项式的值。
6.5.4 多项式求根
n次多项式具有n个根,当然这些根可能是实根,也可能含有若干对共轭复根。MATLAB提供的roots函数用于求多项式的全部根,其调用格式为:
x=roots(P)
其中P为多项式的系数向量,求得的根赋给向量x,即x(1),x(2),…,x(n)分别代表多项式的n个根。
例6-21 求多项式x4+8x3-10的根。
命令如下:
A=[1,8,0,0,-10];
x=roots(A)
若已知多项式的全部根,则可以用poly函数建立起该多项式,其调用格式为:
P=poly(x)
若x为具有n个元素的向量,则poly(x)建立以x为其根的多项式,且将该多项式的系数赋给向量P。
例6-22 已知 f(x)
(1) 计算f(x)=0 的全部根。
(2) 由方程f(x)=0的根构造一个多项式g(x),并与f(x)进行对比。
命令如下:
P=[3,0,4,-5,-7.2,5];
X=roots(P) %求方程f(x)=0的根
G=poly(X) %求多项式g(x)