序列生成与滑动平均滤波

一、实验目的
1.熟悉MATLAB编程环境、掌握MATLAB编程特点、了解数字信号处理工具箱;掌握常用图形绘制与标注方法。
2.掌握基于计算机软件的正弦序列、指数序列、复正弦序列、多频正弦序列、含噪声序列的生成方法。
3.掌握MATLAB的函数编程方法,掌握滑动平均滤波原理及实现方法,掌握窗口长度对滑动平均结果的影响规律。
二、实验过程与实验结果
1.简单序列生成
在这里插入图片描述
程序如下:

N=100;n=0:1:N-1;
x1=cos(pi*n/16);x2=cos(15*pi*n/16);
figure(1)
subplot(2,1,1),stem(n,x1);
title('X1[n]=cos(w1*n),w1=pi/16,N=100,18373227林春志')
xlabel('n');ylabel('幅度');
subplot(2,1,2),stem(n,x2);
title('X2[n]=cos(w2*n),w2=15*pi/16,N=100,18373227林春志')
xlabel('n');ylabel('幅度');

结果如图1所示 :
图1.余弦序列
在这里插入图片描述
程序如下:

N=30;n=0:1:N-1;r1=0.9;r2=-0.9;
x1=r1.^n;x2=r2.^n;
figure(1)
subplot(2,1,1),stem(n,x1);
title('X1[n]=r1^n,N=30')
xlabel('n');ylabel('幅度');
subplot(2,1,2),stem(n,x2);
title('X2[n]=r2^n,N=30')
xlabel('n');ylabel('幅度');

结果如图2所示:
图2.指数序列
在这里插入图片描述
程序如下:

r1=0.9;w=pi/8;
n=0:1:49;
x1=real(r1.^n.*exp(1i*w*n));
x2=imag(r1.^n.*exp(1i*w*n));
figure(1)
subplot(2,1,1),stem(n,x1);
title('正弦分量');
xlabel('n');ylabel('幅度');
subplot(2,1,2),stem(n,x2);
title('余弦分量');
xlabel('n');ylabel('幅度'); 

结果如图3所示:
图3.复指数序列
在这里插入图片描述
程序如下:

n=0:1:149;
A1=1;w1=pi/32;theta1=0;
x1=A1*cos(w1*n+theta1);
A2=0.75;w2=3*pi/32;theta2=pi/3;
x2=A2*cos(w2*n+theta2);
A3=0.25;w3=5*pi/32;theta3=2*pi/3;
x3=A3*cos(w3*n+theta3);
xn=x1+x2+x3;
figure(1)
subplot(2,1,1),stem(n,x1);
title('幅度为A1=1.0、频率为w1=π/32、相位为0');
xlabel('n');ylabel('幅度');
subplot(2,1,2),stem(n,x2);
title('幅度为A2=0.75、频率为w2=3π/32、相位为π/3');
xlabel('n');ylabel('幅度');
figure(2)
subplot(2,1,1),stem(n,x3);
title('幅度为A3=0.25、频率为w3=5π/32、相位为2π/3');
xlabel('n');ylabel('幅度');
subplot(2,1,2),stem(n,xn);
title('复合序列');
xlabel('n');ylabel('幅度');

结果如图4.1和4.2所示:
图4.1前两个正弦序列
图4.2 第三个正弦序列与多频正弦序列
在这里插入图片描述
程序如下所示:

n=0:1:149;
A=1;w1=pi/16;
x1=A*sin(w1*n);
x2=rand(1,150);
z1=0.6*(x2-0.5);
x3=x1+z1;
figure(1)
subplot(3,1,1),stem(n,x1);
title('正弦序列');
xlabel('n');ylabel('幅度');
subplot(3,1,2),stem(n,z1);
title('噪声序列');
xlabel('n');ylabel('幅度');
subplot(3,1,3),stem(n,x3);
title('含噪声正弦序列');
xlabel('n');ylabel('幅度');

结果如图5所示:
图5.含噪声序列
在这里插入图片描述

1.n=0:1:149;
2.A=1;w1=pi/16;
3.x1=A*sin(w1*n);
4.x2=rand(1,150);
5.z1=0.3*(x2-0.5);
6.xn=x1+z1;
7.y1 = MAF(xn,3);
8.y2 = MAF(xn,5);
9.y3 = MAF(xn,7);
10.y4 = MAF(xn,9);
11.y5 = MAF(xn,11);
12.figure(1)
13.subplot(2,1,1),stem(n,xn);
14.title('含噪声正弦序列');
15.xlabel('n');
16.ylabel('幅度');
17.subplot(2,1,2),stem(n,y1);
18.title('3点滑动平均');
19.xlabel('n');
20.ylabel('幅度');
21.figure(2)
22.subplot(2,1,1),stem(n,y2);
23.title('5点滑动平均');
24.xlabel('n');
25.ylabel('幅度');
26.subplot(2,1,2),stem(n,y3);
27.title('7点滑动平均');
28.xlabel('n');
29.ylabel('幅度');
30.figure(3)
31.subplot(2,1,1),stem(n,y4);
32.title('9点滑动平均');
33.xlabel('n');
34.ylabel('幅度');
35.subplot(2,1,2),stem(n,y5);
36.title('11点滑动平均');
37.xlabel('n');
ylabel('幅度');
function y=MAF(x,len)
n=length(x);
m=(len-1)/2;
y=zeros(1,150);
for i=m+1:1:n-m
for j=-m:1:m
y(i)=y(i)+x(i+j);
end
y(i)=y(i)/len;
end

结果如图6.1、图6.2与图6.3所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要处理用户关于滑动平均滤波法的问题。用户希望了解实现方法、应用场景以及示例。首先,我要回顾之前提供的引用内容,确保信息准确。 首先,根据引用1、3和4,滑动平均滤波的基本原理是对一段时间内的数据进行平均处理,以减少噪声。实现方面,引用4中的C++代码展示了如何用类来实现滑动平均滤波,维护一个固定大小的窗口,每次更新时减去旧数据,加上新数据,然后计算平均值。用户可能需要不同语言的示例,比如Python或Matlab,但引用中也提到了Matlab的实现,所以可以考虑提供多种语言的代码。 应用方面,引用1提到信号处理、数据分析和图像处理,引用2则指出适用于有较大纯滞后时间的系统和采样周期短的场合。需要将这些应用场景具体化,比如传感器信号去噪、实时数据平滑等。 示例部分,用户可能需要具体的应用案例,比如温度传感器的数据处理。结合引用3中的窗口移动方法,可以设计一个示例,展示如何用滑动平均滤波平滑数据。 另外,用户的问题中还提到了优化方法,比如加权递推平均滤波法,这在引用2中有提到。虽然用户主要问的是滑动平均,但可能也需要简要提及优化变种,以展示知识的深度。 需要注意用户之前的引用中提到了不同实现,比如C语言和C++,可能需要统一用Python或其他更通用的语言来展示示例,同时保持代码简洁易懂。此外,要确保LaTeX格式正确,数学表达式用$...$,独立公式用$$...$$,比如窗口平均的公式。 最后,生成相关问题时要围绕实现细节、应用场景、参数调整和比较其他滤波方法等方面,帮助用户进一步探索。</think>### 滑动平均滤波法详解 #### 一、基本原理 滑动平均滤波(Moving Average Filter)通过计算信号在固定窗口内的平均值来平滑数据。设窗口大小为$N$,第$k$时刻的输出值为: $$y_k = \frac{1}{N} \sum_{i=0}^{N-1} x_{k-i}$$ 其中$x_{k-i}$为当前时刻及前$N-1$个时刻的输入值[^3]。 #### 二、实现方法 1. **固定窗口法** 维护一个固定长度的队列,每次更新时移除最早数据,添加新数据,计算平均值。 **Python示例代码**: ```python class MovingAverageFilter: def __init__(self, window_size): self.window_size = window_size self.buffer = [] self.sum = 0 def filter(self, new_value): if len(self.buffer) >= self.window_size: self.sum -= self.buffer.pop(0) self.buffer.append(new_value) self.sum += new_value return self.sum / len(self.buffer) ``` 2. **递推优化法** 利用递推公式减少重复计算,适用于实时系统: $$y_k = y_{k-1} + \frac{x_k - x_{k-N}}{N}$$ 该方法无需存储全部历史数据,仅需保留最近$N$个数据[^4]。 #### 三、应用场景 1. **传感器信号去噪** 如温度、压力传感器数据中消除高频噪声[^1]。 2. **金融数据分析** 股票价格趋势分析中平滑短期波动。 3. **实时控制系统** 对采样周期短、存在测量噪声的系统进行数据预处理[^2]。 #### 四、参数选择优化 - **窗口大小$N$**: - $N$越大,平滑效果越强,但响应延迟增加。 - 实际需根据信号频率和噪声强度调整。 - **加权滑动平均**: 对窗口内数据赋予不同权重(如指数衰减),提升对近期数据的敏感性[^2]。 --- ### 示例:温度传感器数据滤波 假设原始温度数据为`[22, 23, 25, 21, 19, 24, 20, 26]`,窗口大小$N=3$: 1. 第1个窗口:`[22]` → 输出22.0 2. 第2个窗口:`[22,23]` → 输出22.5 3. 第3个窗口:`[22,23,25]` → 输出23.3 4. 后续窗口依次滑动计算,最终输出序列为:`[22.0, 22.5, 23.3, 23.0, 21.7, 21.3, 21.0, 23.3]` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛汉轻敲乱码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值