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

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('幅度');

image-20230303140656579

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('幅度');

image-20230303140832680

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('幅度');

image-20230303142141922

总体代码

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('幅度');

image-20230303140314688

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的无迹卡尔曼滤波的 Matlab 程序: ```matlab % 状态转移矩阵 F = [1 1; 0 1]; % 测量矩阵 H = [1 0]; % 过程噪声协方差矩阵 Q = [0.1 0; 0 0.1]; % 测量噪声协方差矩阵 R = 1; % 初始状态和协方差矩阵 x_0 = [0; 0]; P_0 = [1 0; 0 1]; % 生成随机数种子 rng(0); % 生成状态和测量噪声 v = mvnrnd([0 0], Q, 100); w = mvnrnd(0, R, 100); % 生成模拟数据 x = zeros(2, 100); y = zeros(1, 100); x(:, 1) = x_0; y(1) = H * x_0 + w(1); for k = 2:100 x(:, k) = F * x(:, k-1) + v(k, :)'; y(k) = H * x(:, k) + w(k); end % 无迹卡尔曼滤波 n = 2; m = 1; alpha = 1e-3; beta = 2; kappa = 0; lambda = alpha^2 * (n + kappa) - n; c = n + lambda; W_m = [lambda/c 0.5/c*ones(1,2*n)]; W_c = W_m; W_c(1) = W_c(1) + (1 - alpha^2 + beta); X = zeros(n, 2*n+1); Y = zeros(m, 2*n+1); X(:, 1) = x_0; P = P_0; for k = 2:100 % 预测 X_ = F * X; P_ = F * P * F' + Q; % 采样 X_s = chol(P_,'lower') * [zeros(n,1) sqrt(c)*eye(n) -sqrt(c)*eye(n)]; X_s = X_s + X_*ones(1,2*n+1); % 加权平均 X_m = X_s * W_m'; P_m = zeros(n, n); for j = 1:2*n+1 P_m = P_m + W_c(j) * (X_s(:,j)-X_m)*(X_s(:,j)-X_m)'; end P_m = P_m + R; % 更新 K = P_m * H' / (H * P_m * H' + R); X = X_m + K * (y(k) - H * X_m); P = P_m - K * H * P_m; end % 画图 t = 1:100; figure; plot(t, x(1,:), 'b', t, X(1,:), 'r'); xlabel('时间'); ylabel('状态'); legend('真实状态', '估计状态'); ``` 程序中使用了一个一维的状态和一个一维的测量,状态转移矩阵 `F` 是一个 $2 \times 2$ 的矩阵,其中第一行表示状态的位置和速度,第二行表示状态的速度。测量矩阵 `H` 是一个 $1 \times 2$ 的矩阵,表示测量结果只包含状态的位置信息。 程序中使用了一个随机数种子,以便多次运行程序时生成相同的随机数序列。程序首先生成状态和测量噪声,然后生成模拟数据。接下来使用无迹卡尔曼滤波对模拟数据进行估计,并将真实状态和估计状态画在同一个图中进行比较。 关于卡尔曼滤波原理及应用,可以参考《统计信号处理》一书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值