滤波算法——一阶滤波


滤波算法——二阶滤波

1. 算法原理

滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。

一阶低通滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

一阶低通滤波的算法公式为:
Y ( n ) = α X ( n ) + ( 1 − α ) Y ( n − 1 ) Y(n)=\alpha X(n)+(1-\alpha)Y(n-1) Y(n)=αX(n)+(1α)Y(n1)其中, α \alpha α是滤波系数,在 ( 0 , 1 ) (0,1) (0,1)上, X ( n ) X(n) X(n)是本次采样值, Y ( n − 1 ) Y(n-1) Y(n1)是上次滤波输出值, Y ( n ) Y(n) Y(n)是本次滤波输出值

一阶滤波相当于将新的采样值与上次的滤波结果计算一个加权平均值。 α \alpha α的取值决定了算法的灵敏度, α \alpha α越大,新采集的值占的权重越大,算法越灵敏,但平顺性差;相反, α \alpha α越小,新采集的值占的比重越小,灵敏度差,但平顺性好。

无源一阶传递函数为
H ( s ) = 1 1 + s C R = ω 0 ω 0 + s H(s)=\frac{1}{1+sCR}=\frac{\omega_0}{\omega_0+s} H(s)=1+sCR1=ω0+sω0
其中 ω 0 \omega_0 ω0为特征角频率

有源一阶低通滤波器要考虑放大器增益,待补充

  • 优点:对周期干扰有良好的抑制作用,适用于波动频率比较高的场合,它不用记录历史数据。
  • 缺点:滞后、灵敏度低。

2. 代码实现

% LPF1o: 一阶低通滤波器函数
    % 
    % 用法:
    %   xFilt = LPF1o(Tc, tor, xRaw, xFilt)
    %
    % 输入参数:
    %   - Tc: 滤波器的时间常数 (秒)
    %   - tor: 采样时间间隔 (秒)
    %   - xRaw: 未经滤波的原始输入信号
    %   - xFilt: 上一个时刻的滤波输出
    %
    % 输出参数:
    %   - xFilt: 经过一阶低通滤波器处理后的输出信号
function xFilt = LPF1o(Tc,tor,xRaw,xFilt)
    ratio=Tc/tor;
    xFilt=ratio*xRaw+(1-ratio)*xFilt;
end

在代码中调用LPF1o函数

% 需要滤波的原始信号
Z=toolVel(3,:);
datasize = length(Z(1,:));

% 设置滤波参数
tor = 0.002; % 采样时间间隔
Tc = 0.1*tor; % 滤波器时间常数
Z_filt=zeros(1,datasize);%滤波后的信号

% 逐个元素进行滤波
for i = 1:datasize
    Z_filt(i) = LPF1o(Tc,tor,Z(i),Z_filt(i));
end

% 绘制原始信号和滤波后的信号
figure;
subplot(2,1,1);
plot(Z);
title('原始信号');
subplot(2,1,2);
plot(Z_filt);
title('滤波后的信号');
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ```C #include <stdio.h> /* 一低通滤波函数 */ void low_pass_filter(double input[], double output[], int len, double alpha) { /* 初始化输出数组 */ output[0] = input[0]; /* 循环遍历输入数组 */ for (int i = 1; i < len; i++) { /* 一低通滤波计算公式 */ output[i] = output[i-1] + alpha * (input[i] - output[i-1]); } } int main() { double input[] = {1, 2, 3, 4, 5}; double output[5]; double alpha = 0.5; // 滤波系数 int len = sizeof(input) / sizeof(input[0]); // 输入数组长度 /* 调用低通滤波函数 */ low_pass_filter(input, output, len, alpha); /* 打印输出数组 */ for (int i = 0; i < len; i++) { printf("%.2f ", output[i]); } return 0; } ``` 上面的代码是一个简单的C语言一低通滤波代码,主要包含了一低通滤波函数low_pass_filter()和主函数main()。low_pass_filter()函数接收输入数组、输出数组、数组长度和滤波系数作为参数,并使用一低通滤波计算公式对输入数组进行滤波。在主函数中调用low_pass_filter()函数并打印输出数组。 ### 回答2: 下面是一个使用C语言编写的完整的一低通滤波代码,包括主函数和中文注释: ```c #include <stdio.h> #define SAMPLE_SIZE 10 // 每次输入的样本个数 #define ALPHA 0.2 // 滤波器系数,控制滤波效果 float lowPassFilter(float prevFilteredValue, float inputValue) { float filteredValue = prevFilteredValue + ALPHA * (inputValue - prevFilteredValue); return filteredValue; } int main() { float samples[SAMPLE_SIZE] = {0}; // 存储输入样本的数组 float filteredSamples[SAMPLE_SIZE] = {0}; // 存储滤波后的样本的数组 printf("请输入%d个样本值:\n", SAMPLE_SIZE); for (int i = 0; i < SAMPLE_SIZE; i++) { scanf("%f", &samples[i]); // 读取输入的样本值 if (i == 0) { filteredSamples[i] = samples[i]; // 初始滤波后的样本值等于第一个输入样本值 } else { filteredSamples[i] = lowPassFilter(filteredSamples[i-1], samples[i]); // 通过一低通滤波函数获取滤波后的样本值 } } printf("经过一低通滤波后的样本值为:\n"); for (int i = 0; i < SAMPLE_SIZE; i++) { printf("%.2f ", filteredSamples[i]); // 输出滤波后的样本值 } return 0; } ``` 这段代码中,我们首先定义了两个常量:`SAMPLE_SIZE`代表每次输入的样本个数,`ALPHA`代表滤波器的系数,控制滤波效果。然后我们定义了一个`lowPassFilter`函数,用于实现一低通滤波功能。 在主函数中,我们定义了两个数组:`samples`存储输入样本的值,`filteredSamples`存储滤波后的样本值。然后通过循环,依次读取输入的样本值,并根据滤波器系数和前一个滤波后的样本值计算出当前的滤波结果,存储到`filteredSamples`数组中。 最后,我们输出滤波后的样本值。在这个例子中,我们假设输入`SAMPLE_SIZE`个样本值依次为1.0, 2.0, 3.0, ...,经过一低通滤波后,输出的结果应该是:1.0, 1.2, 1.56, ...(保留两位小数)。 请注意,这里的一低通滤波器只是一个简单的例子,实际滤波效果可能需要根据具体要求进行调整或选择其他滤波算法。 ### 回答3: 以下是一个使用C语言编写的一低通滤波的完整代码,带有中文注释。 ```c #include <stdio.h> #define ALPHA 0.1 // 滤波器系数 float lowPassFilter(float input, float prevOutput) { float output = prevOutput + ALPHA * (input - prevOutput); // 一低通滤波器公式 return output; } int main() { float input[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; // 输入信号 float filteredOutput[10]; // 过滤后的输出信号 float prevOutput = 0.0; // 初始化上一个输出为0 for (int i = 0; i < 10; i++) { filteredOutput[i] = lowPassFilter(input[i], prevOutput); // 应用低通滤波器 prevOutput = filteredOutput[i]; // 更新上一个输出为当前输出 } // 输出滤波后的结果 for (int i = 0; i < 10; i++) { printf("输入:%f 输出:%f\n", input[i], filteredOutput[i]); } return 0; } ``` 本代码定义了一个`lowPassFilter`函数,接收输入信号和上一个输出信号作为参数,使用一低通滤波器的公式来计算当前输出信号。在`main`函数中,我们定义了一个长度为10的输入信号数组和一个保存滤波后输出信号的数组。然后,通过循环依次将输入信号传递给滤波器,并将输出保存到数组中。最后,输出滤波后的结果。 注意,滤波器系数`ALPHA`可以根据实际需求进行调整,它决定了滤波器的截止频率。在本代码中,我们将其设置为0.1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值