使用matlab画出一个时钟方波以及对应的频谱图

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('幅度');          %纵坐标为幅度

在这里插入图片描述
仔细想想,其实上大学的时候,学校就有开设过这一堂课,但是当时的我并没有认识到这一工具的重要性;其实准确来说,不止这门课,上大学的时候我脑袋空空,只知道上课考试玩耍,对所有课程都没有属于自己的认识,也并不知道这些课程具体的用途,如何与实际进行联系,所以学起来也都是走马观花,看过而已;现在才开始后知后觉,把这些散落的知识都一一拾起来;

刚刚开始回忆起来,写的比较基础,感谢大家观看,不足之处还望指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值