[LKS32 软件] 一阶低通滤波的C语言实现

[复制链接]
2490|23
 楼主| juliestephen 发表于 2023-4-24 10:42 | 显示全部楼层 |阅读模式
主要添加了一个模拟输入的效果,数据其实就是从matlab里面复制出来的:x=3*sin(2*pi*1*t)+1*sin(2*pi*4*t)。

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

  3. /*************************** 模拟输入数据 ********************************/
  4. float input_data[251] = {
  5.     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,
  6.     3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11,
  7.     0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80,
  8.     -3.63, -3.24, -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35,
  9.     -2.10, -1.59, -0.86, 0.00, 0.86, 1.59, 2.10, 2.35, 2.35, 2.18, 1.94, 1.76,
  10.     1.73, 1.90, 2.26, 2.75, 3.24, 3.63, 3.80, 3.70, 3.30, 2.68, 1.93, 1.18,
  11.     0.54, 0.11, -0.10, -0.11, 0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93,
  12.     -2.68, -3.30, -3.70, -3.80, -3.63, -3.24, -2.75, -2.26, -1.90, -1.73,
  13.     -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59, -0.86, 0.00, 0.86, 1.59,
  14.     2.10, 2.35, 2.35, 2.18, 1.94, 1.76, 1.73, 1.90, 2.26, 2.75, 3.24, 3.63,
  15.     3.80, 3.70, 3.30, 2.68, 1.93, 1.18, 0.54, 0.11, -0.10, -0.11, 0.00, 0.11,
  16.     0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63, -3.24,
  17.     -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59,
  18.     -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,
  19.     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,
  20.     0.00, 0.11, 0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63,
  21.     -3.24, -2.75, -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59,
  22.     -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,
  23.     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,
  24.     0.10, -0.11, -0.54, -1.18, -1.93, -2.68, -3.30, -3.70, -3.80, -3.63, -3.24, -2.75,
  25.     -2.26, -1.90, -1.73, -1.76, -1.94, -2.18, -2.35, -2.35, -2.10, -1.59, -0.86, 0.00};

  26. float get_data(void)
  27. {
  28.   static int i = 0;
  29.   return (input_data[i++]);
  30.   if (i == 251) //轮回
  31.     i = 0;
  32. }

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

  37. /************************ 滤波器初始化 alpha *****************************/
  38. void low_pass_filter_init(void)
  39. {
  40.   float b = 2.0 * pi * fc * Ts;
  41.   alpha = b / (b + 1);
  42. }

  43. float low_pass_filter(float value)
  44. {
  45.   static float out_last = 0; //上一次滤波值
  46.   float out;

  47.   /***************** 如果第一次进入,则给 out_last 赋值 ******************/
  48.   static char fisrt_flag = 1;
  49.   if (fisrt_flag == 1)
  50.   {
  51.     fisrt_flag = 0;
  52.     out_last = value;
  53.   }

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

  57.   return out;
  58. }

  59. void main(void)
  60. {
  61.   float result[251];

  62.   low_pass_filter_init();
  63.   for (int i = 0; i < 251; i++)
  64.   {
  65.     result[i] = low_pass_filter(get_data());
  66.     printf("%f,", result[i]);
  67.   }
  68. }




 楼主| juliestephen 发表于 2023-5-7 17:00 | 显示全部楼层
确定采样频率,然后有双线性变换,离散化,最后写成C代码一阶FILTER 一般是下面的形式y=a*y_1 +b;a,b由采样频率和FILTER的带宽确定
zerorobert 发表于 2023-5-7 17:09 | 显示全部楼层
用C语言实现,希望能给出个完整的已调试好程序
jkl21 发表于 2023-5-7 17:33 | 显示全部楼层
如何用C语言来实现数字滤波器?              
uiint 发表于 2023-5-7 17:56 | 显示全部楼层
如何建立RC一阶低通滤波器模块              
rosemoore 发表于 2023-5-7 19:23 | 显示全部楼层
做这种东西建议用MATLAB               
mollylawrence 发表于 2023-5-7 19:37 | 显示全部楼层
如何用c语言实现截止频率为200hz的巴特沃斯低通滤波器
adolphcocker 发表于 2023-5-7 20:05 | 显示全部楼层
直接调用函数,比较方便               
benjaminka 发表于 2023-5-7 20:22 | 显示全部楼层
滤波器的截止频率怎么求?               
cemaj 发表于 2023-5-7 20:28 | 显示全部楼层
一阶低通滤波算法能怎么改进              
tpgf 发表于 2023-5-17 09:03 | 显示全部楼层
一阶低通滤波器的特性一般用一阶线性微分方程表示
磨砂 发表于 2023-5-17 10:56 | 显示全部楼层
一般,线性连续系统的特性除了可以在"时域"中用微分方程或冲击响应表示外,也可以用以频率为自变量的函数表示,它就是"频率响应",是系统特性的"频域"表示方式。
晓伍 发表于 2023-5-17 11:57 | 显示全部楼层
如果激励源通过一个电阻给电容器构成一个充电回路,并以电容两端的电压作为响应,就构成了一个以一阶微分方程描述的"一阶系统",它的幅频响应在零频率处及其附近等于或接近于1,随着频率的增加,这个系统的幅频响应逐渐平滑地衰减为零
八层楼 发表于 2023-5-17 12:20 | 显示全部楼层
最常用的滤波电路应该是很基本的RC滤波,不管是高通型或是低通型
观海 发表于 2023-5-17 13:29 | 显示全部楼层
双T型滤波电路,能够针对特定的音频频率点产生很高的衰减度,用来做简易的音频失真仪更是好用
guanjiaer 发表于 2023-5-17 14:42 | 显示全部楼层
理论上如果RC数值搭配准确时,可达到60 dB的衰减度。但是如此Q值太高,会使滤波的有效频宽太窄,容易产生频率偏差
abotomson 发表于 2023-6-10 15:54 | 显示全部楼层
根据一阶低通滤波的公式:Yn = (1-alpha)Yn-1 + alphaXn,其中Y为输出,X为输入,n表示当前时刻。可以得到滤波函数的实现方式如上述代码所示。
cemaj 发表于 2023-6-10 16:14 | 显示全部楼层
一阶低通滤波是一种简单有效的信号滤波方法,可以通过降低高频成分来平滑信号。
hearstnorman323 发表于 2023-6-10 16:54 | 显示全部楼层
在使用滤波器时,需要根据具体的信号特性和应用场景选择合适的滤波器类型和参数,以达到预期的滤波效果。
chenci2013 发表于 2023-6-10 17:00 | 显示全部楼层
需要根据具体需求和信号特性选择合适的采样频率和截止频率等参数,以达到更好的滤波效果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

1550

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部