Matlab增采样仿真——代码实现

Posted 四臂西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab增采样仿真——代码实现相关的知识,希望对你有一定的参考价值。

Matlab增采样仿真(2)——代码实现

文章目录

代码讲解

0、全局参数

A = 2;                      % 增采样倍数
Fs = 16;                    % 采样率 单位hz
T = 1/Fs;                   % 采样周期
L = 8;                      % 采样点数
t = (0:L-1)*T;              % 时间间隔

1、生成原始信号

首先生成一个2hz的正弦信号,采样率为16hz,一个周期8个点。

% 生成虚拟信号
x1 = sin(2*pi*2*t); % 采集一个2hz正弦信号

% 绘制原始信号波形
subplot(3,2,1);
stem(x1);
xlabel('原始信号x1');
ylabel('幅度');
% 生成对应频谱
x1_fft=fft(x1);     %fft变换
x1_abs=abs(x1_fft/(L/2));   %取模
x1_abs(1)=2*x1_abs(1);      %幅度归一
subplot(3,2,2);
stem(1:Fs/L:Fs,x1_abs);
xlabel('频率');
ylabel('幅度');

2、增采样过程量

通过函数upsample对原始信号x1进行增采样,生成过程量x2。

可以看到正如理论分析所得到的结论一样,2倍增采样下,频谱由x1的一份,变成两份,幅度也比例衰减2倍。要恢复原始信号,只需要低通滤波就可以。

% 增采样过程量
x2=upsample(x1,A); % 增采样
subplot(3,2,3);
stem(x2);
xlabel('增采样过程量x2');
ylabel('幅度');
% 绘制对应频谱
x2_fft=fft(x2);
x2_abs=abs(x2_fft/(A*L/2));
x2_abs(1)=2*x2_abs(1);
subplot(3,2,4);
stem(1:(Fs*A)/(L*A):Fs*A,x2_abs);
xlabel('频率');
ylabel('幅度');

upsample函数简介

y = upsample(x,n)
  • x 原始信号
  • n 增采样倍数

示例:

x = [1,2,3];
y = upsample(x,3);
y = [1,0,0,2,0,0,3,0,0];

3、低通滤波,实现“增采样”

对信号x2,进行低通滤波,保留2hz频率的部分,再补充幅度损失,就可以得到最终增采样的信号x3。

% 对增采样过程量,做低通滤波,实现完整的"增采样"
x3=lowpass(x2,5,Fs*A); % 以5为截止频率上限,做lowpass
x3=A*x3; % 补充幅度
subplot(3,2,5);
stem(x3);
xlabel('最终增采样信号x3');
ylabel('幅度');
% 绘制对应频谱
x3_fft=fft(x3);
x3_abs=abs(x3_fft/(A*L/2));
x3_abs(1)=2*x3_abs(1);
subplot(3,2,6);
stem(1:(Fs*A)/(L*A):Fs*A,x3_abs);
xlabel('频率');
ylabel('幅度');

总体代码

clear;clc;

A = 2;                      % 增采样倍数
Fs = 16;                    % 采样率 单位hz
T = 1/Fs;                   % 采样周期
L = 8;                      % 采样点数
t = (0:L-1)*T;              % 时间间隔

% 生成虚拟信号
x1 = sin(2*pi*2*t); % 采集一个2hz正弦信号

% 绘制原始信号波形
subplot(3,2,1);
stem(x1);
xlabel('原始信号x1');
ylabel('幅度');
% 生成对应频谱
x1_fft=fft(x1);     %fft变换
x1_abs=abs(x1_fft/(L/2));   %取模
x1_abs(1)=2*x1_abs(1);      %幅度归一
subplot(3,2,2);
stem(1:Fs/L:Fs,x1_abs);
xlabel('频率');
ylabel('幅度');

% 增采样过程量
x2=upsample(x1,A); % 增采样
subplot(3,2,3);
stem(x2);
xlabel('增采样过程量x2');
ylabel('幅度');
% 绘制对应频谱
x2_fft=fft(x2);
x2_abs=abs(x2_fft/(A*L/2));
x2_abs(1)=2*x2_abs(1);
subplot(3,2,4);
stem(1:(Fs*A)/(L*A):Fs*A,x2_abs);
xlabel('频率');
ylabel('幅度');

% 对增采样过程量,做低通滤波,实现完整的"增采样"
x3=lowpass(x2,5,Fs*A); % 以3为截止频率上限,做lowpass
x3=A*x3; % 补充幅度
subplot(3,2,5);
stem(x3);
xlabel('最终增采样信号x3');
ylabel('幅度');
% 绘制对应频谱
x3_fft=fft(x3);
x3_abs=abs(x3_fft/(A*L/2));
x3_abs(1)=2*x3_abs(1);
subplot(3,2,6);
stem(1:(Fs*A)/(L*A):Fs*A,x3_abs);
xlabel('频率');
ylabel('幅度');

以上是关于Matlab增采样仿真——代码实现的主要内容,如果未能解决你的问题,请参考以下文章

svpwm用matlab仿真的时候,采样周期Ts用哪个元件(模块)?

数字信号基于matlab轴承故障仿真信号时域波形图+幅度谱图含Matlab源码 001期

MATLAB仿真信号

基于MATLAB的采样保持器的仿真

通信仿真基于matlab数字信号增量调制含Matlab源码 2381期

大毕设-MATLAB-FFT实现