matlab是一个很强大是数学软件,可以帮助我们把各种构思与想法进行仿真,可视化处理;
本文将会使用matlab画出一个时钟方波,和对应的频谱图;
代码部分的注释非常详细,开始吧。
第一步,先来定义一些变量
Fclk=1; %时钟频率为1Hz
Num_T=100; %信号长度为Num_T个时钟周期
Fs=1000; %采样率为1000
L=(Fs/Fclk)*Num_T; %采样总点数:1个时钟周期的采样点个数Fs/Fclk * 时钟周期的个数Num_T;
%注意采样点个数越多,fft精度越高,但是执行时间越长
T=1/Fs; %采样周期
t=(1:L)*T; %时间长度=一个1~L的行向量*采样周期
第二步,产生时钟方波信号
SIG_CLK=rand(1,2*Num_T); %生成一个名为SIG_CLK的随机数行向量,长度为2*Num_T(因为方波每个周期都会有两个状态1和0),范围在0~1之间
for i = 1:length(SIG_CLK) %创建一个1~length(SIG_CLK)的行向量,并循环赋值给i
if mod(i,2)
SIG_CLK(i)=1; %如果i/2余数为1(即i为基数),将 SIG_CLK(i)赋值为1;
else
SIG_CLK(i)=0; %如果i/2余数为0(即i为偶数),将 SIG_CLK(i)赋值为0;
end
end %循环对SIG_CLK行向量进行赋值,最终SIG_CLK=[1 0 1 0 1 0 ...]
第三步,生成时钟信号采样序列
N=length(t); %时间长度t的长度即为总采样点个数L,赋值为N
LEN_CLK=zeros(1,N); %创建一个1行N列的矩阵(即包含N个元素的行向量),比全都赋值为0
for i=1:N %创建一个1~N的行向量,并循环赋值给i
LEN_CLK(i)=SIG_CLK(ceil(i/((Fs/Fclk)/2)));
%一个时钟周期中包含(Fs/Fclk)个采样周期,一个时钟周期的前一半包含((Fs/Fclk)/2))个采样周期,ceil为向上取整(i/((Fs/Fclk)/2))
%将采样序列每个周期中前半部分采样点都赋值为1,后半部分采样点都赋值为0;
end
第四步,生成时钟方波信号和对应的频谱图
figure; %创建新图形窗口
subplot(2,2,[1 2]); %创建一个2行2列的子图网络,并且将1和2子图位置合成一个更大的网络
plot(t,LEN_CLK,'r'); %用于绘制二维图形,X轴上为时间长度行向量t,Y轴上为采样序列LEN_CLK,图像颜色为r(red,红色)
title('方波时钟信号'); %图像标题为'方波时钟信号'
set(gca,'XLim',[0 100]); %X轴的数据显示范围,0-100
set(gca,'YLim',[0 1]); %Y轴的数据显示范围,0-1
xlabel('时间/t'); %横坐标为时间/t
ylabel('幅度'); %纵坐标为幅度
subplot(2,2,[3 4]); %创建一个2行2列的子图网络,并且将3和4子图位置合成一个更大的网络
X_LEN_CLK=abs(fft(LEN_CLK));
%对方波时钟信号的采样序列 LEN_CLK先经行快速傅里叶变化(fft),在进行取模(abs),再赋值给X_LEN_CLK
semilogx(Fs*(0:(L/2))/L,X_LEN_CLK(1:L/2+1)*2/L);
%semilogx绘制图形,X轴为对数尺度,Y轴为线性尺度;
%Fs*(0:(L/2))/L————采样频率Fs * 一半频率索引(0:(L/2)) / 总采样个数 ———— 将X轴频率转化为0~1/2*Fs(Nyquist频率)的频率范围;
%X_LEN_CLK(1:L/2+1)*2/L————提取X_LEN_CLK的前L/2+1个元素(FFT结果的前半部分,表示正频率成分),*2/L对FFT结果进行归一化处理;
% set(gca, 'XTickLabel' ,{'0.1','1','10','100','10K','100K'}); %x轴频率数据
title('时钟频谱'); %图像标题为'时钟频谱'
set(gca,'XLim',[0.5 1000]);%x轴的数据显示范围
set(gca,'YLim',[0.0001 0.7]);%y轴的数据显示范围
xlabel('f (Hz)'); %横坐标为f (Hz)
ylabel('幅度'); %纵坐标为幅度
第五步,将频率为1时的频谱经行展开处理
figure;
semilogx(Fs*(0:(L/2))/L,X_LEN_CLK(1:L/2+1)*2/L);
%semilogx绘制图形,X轴为对数尺度,Y轴为线性尺度;
%Fs*(0:(L/2))/L————采样频率Fs * 一半频率索引(0:(L/2)) / 总采样个数 ———— 将X轴频率转化为0~1/2*Fs(Nyquist频率)的频率范围;
%X_LEN_CLK(1:L/2+1)*2/L————提取X_LEN_CLK的前L/2+1个元素(FFT结果的前半部分,表示正频率成分),*2/L对FFT结果进行归一化处理;
title('展开频率为1时的频谱');
set(gca,'XLim',[0.95 1.05]);%x轴的数据显示范围
set(gca,'YLim',[0.0 0.7]);%y轴的数据显示范围
xlabel('f (Hz)'); %横坐标为f (Hz)
ylabel('幅度'); %纵坐标为幅度
仔细想想,其实上大学的时候,学校就有开设过这一堂课,但是当时的我并没有认识到这一工具的重要性;其实准确来说,不止这门课,上大学的时候我脑袋空空,只知道上课考试玩耍,对所有课程都没有属于自己的认识,也并不知道这些课程具体的用途,如何与实际进行联系,所以学起来也都是走马观花,看过而已;现在才开始后知后觉,把这些散落的知识都一一拾起来;
刚刚开始回忆起来,写的比较基础,感谢大家观看,不足之处还望指正。