一阶低通滤波的C语言实现(简单易移植)

这篇具有很好参考价值的文章主要介绍了一阶低通滤波的C语言实现(简单易移植)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 引言

一阶低通滤波器(Low Pass Filter,LPF),核心参数为截止频率fc,该算法可以保留截止频率以内的信号,而衰减截止频率之外的信号。主要用于去除高频噪声。

1 一阶低通滤波器模型

一阶低通滤波公式如下:
c语言低通滤波,c语言,c语言,matlab,算法

也可以写作:
c语言低通滤波,c语言,c语言,matlab,算法

其中:
c语言低通滤波,c语言,c语言,matlab,算法

参数说明:y(n)为本次滤波输出值,y(n-1)为上次滤波输出值,x(n)为本次采样值。Ts为采样周期,fc为截止频率。α范围为[0,1]

2 matlab 实现

我们假设,现在有一个信号,它包含了频率为1Hz(幅值为3)和4Hz(幅值为1)的两个正弦波。
c语言低通滤波,c语言,c语言,matlab,算法
c语言低通滤波,c语言,c语言,matlab,算法

如图所示:黄色为叠加后的信号。
我们假定采样周期为0.02s,且需要保留1Hz的信号(那么截止频率应该在1Hz~4Hz之间,先取1Hz)。


c语言低通滤波,c语言,c语言,matlab,算法


c语言低通滤波,c语言,c语言,matlab,算法

2.1 matlab 代码

t=(0:0.02:5);
x=3*sin(2*pi*1*t)+1*sin(2*pi*4*t);%采集的混合信号

plot(t,x);
hold on 

fc=2;%截止频率
Ts=0.02;%采样周期

b=2*pi*fc*Ts;
alpha=b/(b+1);%alpha

y=zeros(1,251);

y(1)=x(1)
for n= 2:251
    y(n)=y(n-1)+alpha*(x(n)-y(n-1));%一阶滤波
end

plot(t,y);

c语言低通滤波,c语言,c语言,matlab,算法

我们将滤波后的波形和理论的1Hz的波形对比:
c语言低通滤波,c语言,c语言,matlab,算法

你会发现:

  1. 确实有效果
  2. 波形幅度变小了
  3. 波形滞后了

因此,一阶低通滤波,存在滞后的现象。那么我们可以适当修改一下α,比如,将截止频率设置为2Hz,再看看效果。
c语言低通滤波,c语言,c语言,matlab,算法

你会发现:

  • 幅值变化不大
  • 相位滞后不大

2.2 总结

对于一阶低通滤波器,截止频率应在有效信号频率和杂波频率之间。
越接近有效信号频率,则滤波效果越强,但存在相位更加滞后,幅度衰减越厉害的情况。
因此,应该多次设值,从而寻找一个能够兼顾响应速度与滤波效果的值。

3 c语言实现

虽然在网上看到别人写的c语言实现,但基本是原理说明,搬过来没办法直接使用,还要修修改改的,就很难受。
我这里模拟采集信号的过程,写一个c语言的实现。主要添加了一个模拟输入的效果,数据其实就是从matlab里面复制出来的:x=3*sin(2*pi*1*t)+1*sin(2*pi*4*t)


#include <stdio.h>
#include <string.h>

/*************************** 模拟输入数据 ********************************/
float input_data[251] = {
    0.00, 0.86, 1.59, 2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 1.73, 1.90, 2.26, 2.75,
    3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11,
    0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, 
    -3.63, -3.24, -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35,
    -2.10, -1.59, -0.86, 0.00, 0.86, 1.59, 2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 
    1.73, 1.90, 2.26, 2.75, 3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18,
    0.54, 0.11, -0.10, -0.11, 0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93, 
    -2.68, -3.30, -3.70, -3.80, -3.63, -3.24, -2.75, -2.26, -1.90, -1.73,
    -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59, -0.86, 0.00, 0.86, 1.59,
    2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 1.73, 1.90, 2.26, 2.75, 3.24, 3.63, 
    3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11, 0.00, 0.11,
    0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63, -3.24,
    -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59,
    -0.86, 0.00, 0.86, 1.59, 2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 1.73, 1.90, 2.26,
    2.75, 3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11,
    0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63, 
    -3.24, -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59,
    -0.86, 0.00, 0.86, 1.59, 2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 1.73, 1.90, 2.26, 2.75, 
    3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11, 0.00, 0.11,
    0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63, -3.24, -2.75,
    -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59, -0.86, 0.00};

float get_data(void)
{
  static int i = 0;
  return (input_data[i++]);
  if (i == 251) //轮回
    i = 0;
}

float fc = 2.0f;     //截止频率
float Ts = 0.02f;    //采样周期
float pi = 3.14159f; //π
float alpha = 0;     //滤波系数

/************************ 滤波器初始化 alpha *****************************/
void low_pass_filter_init(void)
{
  float b = 2.0 * pi * fc * Ts;
  alpha = b / (b + 1);
}

float low_pass_filter(float value)
{
  static float out_last = 0; //上一次滤波值
  float out;

  /***************** 如果第一次进入,则给 out_last 赋值 ******************/
  static char fisrt_flag = 1;
  if (fisrt_flag == 1)
  {
    fisrt_flag = 0;
    out_last = value;
  }

  /*************************** 一阶滤波 *********************************/
  out = out_last + alpha * (value - out_last);
  out_last = out;

  return out;
}

void main(void)
{
  float result[251];

  low_pass_filter_init();
  for (int i = 0; i < 251; i++)
  {
    result[i] = low_pass_filter(get_data());
    printf("%f,", result[i]);
  }
}


我这里使用的是VSCode,将终端输出的数据直接复制到matlab加点代码就可以观察了。(excel也行,但插入数据后会坨在一格里,要点击分列)。
效果如下:
c语言低通滤波,c语言,c语言,matlab,算法
c语言低通滤波,c语言,c语言,matlab,算法

4 matlab 查看波形频率(快速傅里叶变换,FFT)

有时候,我们想先分析我们的数据的频率组成,或者观察滤波效果,我们可以观察他们的频率。这里用的是快速傅里叶变换。
这里分析X=3*sin(2*pi*1*t)+1*sin(2*pi*4*t),代码如下:

t=(0:0.02:5);% 时间向量
X=3*sin(2*pi*1*t)+1*sin(2*pi*4*t);%采集的混合信号


Ts = 0.02;            % 采样周期
Fs = 1/Ts;            % 采样频率 
L = length(t);          % 获取信号长度


n = 2^nextpow2(L);%首先从原始信号长度确定下一个 2 次幂的新输入长度。这将用尾随零填充信号 X 以改善 fft 的性能。
%%%%%%%%%%%%%%%%%%%%%%% 快速傅里叶变换 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Y = fft(X,n);%信号的傅里叶变换
P2 = abs(Y/n);%计算双侧频谱 P2

P1 = P2(1:n/2+1);%基于 P2 和偶数信号长度 L 计算单侧频谱 P1。
P1(2:end-1) = 2*P1(2:end-1);%双侧边变成单侧侧边,幅度叠加

f = Fs*(0:(n/2))/n;%定义频域 f 
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

c语言低通滤波,c语言,c语言,matlab,算法

我们将之前代码的滤波输出(fc=2)直接赋值给X,进行观察:
c语言低通滤波,c语言,c语言,matlab,算法
c语言低通滤波,c语言,c语言,matlab,算法

可以看到,频率为4Hz的信号幅度衰减超过一半,而1Hz的衰减非常少。说明效果还是不错的。文章来源地址https://www.toymoban.com/news/detail-819493.html

到了这里,关于一阶低通滤波的C语言实现(简单易移植)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像处理之理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器的matlab实现去噪

    一、前言 在一幅图像中, 低频部分对应图像变化缓慢的部分即图像大致外观和轮廓。高频部分对应图像变换剧烈的部分即图像细节(注意图像的噪声属于高频部分) 。 低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。即 低通滤波的效

    2023年04月09日
    浏览(47)
  • MATLAB实现低通滤波器(附完整代码)

    1.MATLAB实现低通滤波器 以下是一个完整的示例,包括生成一个包含高频噪声的信号,然后使用一个低通滤波器对其进行滤波,最后绘制原始信号和滤波后的信号。 % 设置参数 Fs = 1000;  % 采样率 Fc = 100;   % 截止频率 N = 60;  % 滤波器的阶数 T = 1/Fs;  % 采样周期 L = 1000;  % 信号长

    2024年04月09日
    浏览(46)
  • Matlab图像处理频域滤波实现——巴特沃斯低通、高通、带通带阻滤波器

    巴特沃斯滤波器是一种常用于图像处理的滤波器,它在频域中的传递函数具有更加平滑的过渡,相对于理想滤波器来说,巴特沃斯滤波器可以更好地控制截止频率和滤波器的阶数。下面是巴特沃斯滤波器的不同类型的原理简介: 1.原理 (1)巴特沃斯低通滤波(Butterworth Lowp

    2024年04月09日
    浏览(53)
  • 完全解读低通滤波,并且用其C语言实现

    低通滤波是一种信号处理技术,它可以用于去除高频信号成分,只保留低频信号成分。低通滤波器的本质是一个线性时不变系统,它可以通过差分方程或者频域响应的形式来描述。 在差分方程的形式下,低通滤波器可以表示为: y [ n ] = b 0 x [ n ] + b 1 x [ n − 1 ] + b 2 x [ n −

    2024年02月04日
    浏览(62)
  • 用C语言实现一个FIR低通滤波器算法

    +v hezkz17进数字音频系统研究开发交流答疑    以下是一个基于C语言的FIR低通滤波器算法的实现: #include stdio.h #include stdlib.h #define N 5     // 滤波器长度 #define M 100   // 输入数据长度 double h[N] = {0.2, 0.3, 0.4, 0.1, 0.0};  // 滤波器系数 int main() {     double x[M], y[M];     // 生成输入信

    2024年02月16日
    浏览(42)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(46)
  • MATLAB学习——低通滤波(频域滤波(一))

    目录 1.概论 2.低通滤波 (1)理想低通滤波     代码(理想低通滤波) (2)巴特沃斯低通滤波器    代码(巴特沃斯低通滤波) (3)高斯低通滤波器   频率域图像增强首先通过傅立叶变换将图像从空间域转换到频率域,在频率域对图像进行处理,处理后再将图像进行傅立

    2023年04月12日
    浏览(57)
  • Matlab演示低通滤波器

    首先输入两个音频文件(可以自己录两段音频) fs是采样频率。 我们可以用n接收x1。再用n除以采样频率fs,即可得到x1消耗的秒数。 由于两个信号长度不同,所以接下来我们需要统一两个信号的长度 将较短的那个信号的空白部分用0填充。 信号等长之后直接将两个信号通入低

    2024年02月13日
    浏览(37)
  • MATLAB图像的频域低通滤波(灰度图像滤波+彩色图像滤波)

    数字图像处理完整MATLAB代码在我的资源可以看到,为方便下载,下面是百度网盘资源: 链接:https://pan.baidu.com/s/17S7PZJwwvb3PFMFVxqEY5w  提取码:HUAT 具体处理过程如下: 1.Imread 函数读取图像数据 2.RGB图像转换为灰度二维图 3.调用fft2函数对灰度二维图像进行DFT处理 4.调用abs函数取

    2024年02月05日
    浏览(59)
  • Matlab图像处理- 高斯低通滤波器

      高斯低通滤波器 高斯低通滤波器是一种 更平滑的一种滤波器 ,高斯低通滤波器完全没有振铃现象,且边缘平滑。 示例代码 利用输入图像,构建一个截止频率为30的高斯低通滤波器的透视图如下图所示。 效果图片

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包