题目1: 周期信号的频谱
设有一周期方波信号,幅度E=1.5V,周期T=100 ,脉冲宽度与周期之比为τ/t=1/2 ,时间轴上采样点数取1000点。试求其含有20次谐波的信号的频谱特性;求其傅立叶逆变换波形并与原时间波形进行比较。
解释:
1.T=100; f1=1/T; N=1000;:定义了周期 T,频率 f1 和采样点数 N。
2.t=linspace(0,T,N);:生成了一个包含 N 个元素的向量 t,表示采样时刻的时间点。当我们需要在一段区间内生成一定数量的等间距采样点时,可以使用 linspace 函数。y = linspace(x1, x2, n)其中,x1 和 x2 是区间的起始点和终止点,n 是需要生成的采样点数量。该函数返回一个长度为 n 的向量 y,其中包含了从 x1 到 x2 的等间距的采样点。具体而言,y 的第一个元素为 x1,最后一个元素为 x2,中间的元素按照等间距分布在 x1 和 x2 之间。这里linspace 函数用于生成了一个包含 N 个元素的向量 t,其中 t 的起始点为 0,终止点为 T,采样点数量为 N,即 t = linspace(0,T,N)。这个向量表示了采样时刻的时间点,用于计算傅里叶变换和逆变换。
3.dt=T/(N-1);:计算采样时间间隔 dt。
4.x=1.5*[ones(1,N/2),zeros(1,N/2)];:生成了一个长度为 N 的周期信号 x,由一个幅值为 1.5 的矩形波和一个幅值为零的零信号组成。其中,ones(1,N/2) 生成1行,长度为 N/2 的全 1 向量,zeros(1,N/2) 生成1行,长度为 N/2 的全 0 向量,[ones(1,N/2),zeros(1,N/2)] 表示将这两个向量合并在一起。(τ/t=1/2 )。生成长度为 N 的周期信号,是为了对这个信号进行傅里叶变换和逆变换。在 MATLAB 中,对信号进行傅里叶变换需要对信号进行采样,并将采样结果输入到傅里叶变换函数中。而进行傅里叶逆变换则需要使用傅里叶系数作为输入。在本题中,通过生成长度为 N 的周期信号,可以进行采样并计算出傅里叶系数 X,同时,也可以将这个周期信号输入傅里叶逆变换计算出来的重构信号 x2 与原信号 x 进行比较。因此,生成长度为 N 的周期信号是为了进行信号的傅里叶分析和逆变换,而采样点数量 N 决定了采样信号的精度和计算复杂度。
5.n=[-20:20];:定义了需要计算的傅里叶级数 n 的范围。
6.w1=2pif1;:计算了频率 f1 对应的角频率 w1。
7.X=xexp(-jt’nw1)dt/T;:计算了信号 x 的离散傅里叶变换 X。其中,t’ 表示将 t 向量转置为列向量,因为n是行向量,这里表示矩阵乘法,exp(-j*t’nw1) 表示计算了离散傅里叶变换的系数。
8.最后就是绘图环节。
T=100;f1=1/T;N=1000;
t=linspace(0,T,N);
dt=T/(N-1);
x=1.5*[ones(1,N/2),zeros(1,N/2)];
n=[-20:20];
w1=2*pi*f1;
X=x*exp(-j*t'*n*w1)*dt/T;
subplot(1,2,1); stem(n,abs(X)); grid; title('周期信号的幅度谱')
x2=X*exp(j*n'*w1*t);
subplot(1,2,2); plot(t,x,'r',t,x2); title('原信号与傅立叶逆变换比较')
题目2:
绘制周期矩形脉冲信号的振幅频谱。
t = linspace(0, T, N+1); t(end) = [];
代码解释:
t = linspace(0, T, N+1); 这行代码生成了一个从0到T的时间轴,共有N个采样点。linspace函数将0到T等间隔地分为N个部分,得到一个长度为N+1的向量。
t(end) = [];t(end) = []; 表示将 t 数组的最后一个元素删除。在上下文中,t 数组是用来表示时间轴的,其元素个数为采样点数 N。由于 linspace 函数会生成 N+1 个元素,因此我们需要将最后一个元素删除,使得 t 数组的长度为 N,与信号的长度相同。这样可以确保时间轴与信号的长度是匹配的,方便进行傅里叶变换以及后续的频域分析。
x = zeros(1, N);这行代码生成了一个长度为N的0向量,它将被用于存储周期矩形脉冲信号。
x(t < tau) = 1;这行代码将时间轴上小于tau的位置的信号赋值为1,以生成周期矩形脉冲信号。在上面生成时间向量t后,我们根据条件 t < tau 选出时间轴上小于tau的位置,然后将这些位置的信号赋值为1。这几行代码的作用是生成一个周期矩形脉冲信号,并将信号存储在向量x中。
X = abs(fft(x)/N);在行代码是将周期矩形脉冲信号 x 进行离散傅里叶变换,然后除以信号长度 N 得到傅里叶变换的归一化系数。这个归一化系数的作用是保证傅里叶变换的结果与原始信号的幅度有一个对应关系,因此我们将其除以信号长度,得到正确的幅度谱 X。
f = linspace(0, Fs/2, N/2+1);由于周期矩形脉冲信号是实数信号,因此其频谱是对称的,只需要绘制频率范围为 0 到 Fs/2 的一半频谱即可。同时,由于傅里叶变换后的频域数据是关于频率 Fs/2 对称的,因此只需要绘制一半即可。而 N/2+1 表示采样点的一半加一,因为在离散傅里叶变换中,频率分量的数量是采样点数量的一半加一。
Fs = 100; % 采样频率
T = 5; % 信号周期
tau = 1; % 脉冲宽度
N = 100; % DFT点数
% 生成周期矩形脉冲信号
t = linspace(0, T, N+1);
t(end) = [];
x = zeros(1, N);
x(t < tau) = 1;
% 计算振幅频谱
X = abs(fft(x)/N);
% 绘制振幅频谱
f = linspace(0, Fs/2, N/2+1);
stem(f, X(1:N/2+1));%单边
xlabel('频率');
ylabel('幅度');
title('周期矩形信号的幅度谱');