本节在 matlab heaviside函数生成矩形脉冲 和 matlab 编写计算傅里叶级数函数 的基础上,求一个矩形脉冲序列的傅里叶级数。
这里只求了一个周期矩形脉冲的傅里叶级数,因为我不知道怎么用一个matlab函数表示整个矩形脉冲序列。
需要注意的是,这里的傅里叶级数函数,需要传入积分的下限和上限,也就是你要求的那个矩形脉冲所在的区间。
clear all;
clf;%一定要加这行代码,否则可能你之前的代码能运行生成正确图形,改错之后,运行结果还是之前的图形,每次运行前必须先做清理
syms t;
T = 1;%矩形脉冲的周期
N = 5;%每个for循环生成的矩形脉冲数
%生成[T-1/4*T, N*T - 1/4*T]区间内的信号
for k = 1: N,
x(k) = heaviside(t - T * k + T/4) - heaviside(t - T * k - T/4);
end
%生成[-N*T-1/4*T, T-1/4*T]区间内的信号
for k = N: -1 :1,
x2(k) = heaviside(t + T * k + T/4) - heaviside(t + T * k - T/4);
end
%生成[T-1/4*T, T-1/4*T]区间内的信号
x3 = heaviside(t + T/4) - heaviside(t - T/4);
%把以上信号都整合起来,然后幅值乘以2
f = 2 * [x x2 x3];
subplot(221);
fplot(f, [-10, 10]);
%=================================== 以上是生成矩形脉冲的代码 ==============================================
%=================================== 以下是求上面矩形脉冲的傅里叶级数的代码 =================================
M = 6;%谐波次数,可以任意指定
[X1, w1] = fourierseries(f(6), M, T, -1.5, -0.5);%注意这里,只能求 函数数组f 中其中一个元素的傅里叶级数,不能把 函数数组f 直接传进去, 而且要特别注意传递的周期一定要准确,否则得出的结果很可能是0
disp(f(6));
X = [conj(fliplr(X1(2:M))) X1];
w = [-fliplr(w1(2:M)) w1];
disp(X);
subplot(222);
stem(w, X);
subplot(223);
stem(w, abs(X));
subplot(224);
stem(w, [-angle(X1(2:M)) angle(X1)]);
%计算函数 x 的 N 次谐波的傅里叶级数系数,函数的周期为 T
%数组 X 存放的是傅里叶系数,也就是幅值
%数组 w 存放的是频率
%x为函数
%M是谐波次数
%T是函数周期
%START为积分的下限
%END为积分的上限
function [X, w]=fourierseries(x, M, T, START, END)
syms t;%因为传进来的x函数中包含符号 t,所以函数内部也要定义符号变量 t,否则会报错
for k = 1: M,
X(k)=int(x * exp(-j*2*pi*(k-1)*t/T), t, START, END)/T;
w(k)=(k-1)*2*pi/T;
end
end