打印
[LKS32 软件]

一阶低通滤波的C语言实现

[复制链接]
1425|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
juliestephen|  楼主 | 2023-4-24 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主要添加了一个模拟输入的效果,数据其实就是从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]);
  }
}




使用特权

评论回复
沙发
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语言来实现数字滤波器?              

使用特权

评论回复
5
uiint| | 2023-5-7 17:56 | 只看该作者
如何建立RC一阶低通滤波器模块              

使用特权

评论回复
6
rosemoore| | 2023-5-7 19:23 | 只看该作者
做这种东西建议用MATLAB               

使用特权

评论回复
7
mollylawrence| | 2023-5-7 19:37 | 只看该作者
如何用c语言实现截止频率为200hz的巴特沃斯低通滤波器

使用特权

评论回复
8
adolphcocker| | 2023-5-7 20:05 | 只看该作者
直接调用函数,比较方便               

使用特权

评论回复
9
benjaminka| | 2023-5-7 20:22 | 只看该作者
滤波器的截止频率怎么求?               

使用特权

评论回复
10
cemaj| | 2023-5-7 20:28 | 只看该作者
一阶低通滤波算法能怎么改进              

使用特权

评论回复
11
tpgf| | 2023-5-17 09:03 | 只看该作者
一阶低通滤波器的特性一般用一阶线性微分方程表示

使用特权

评论回复
12
磨砂| | 2023-5-17 10:56 | 只看该作者
一般,线性连续系统的特性除了可以在"时域"中用微分方程或冲击响应表示外,也可以用以频率为自变量的函数表示,它就是"频率响应",是系统特性的"频域"表示方式。

使用特权

评论回复
13
晓伍| | 2023-5-17 11:57 | 只看该作者
如果激励源通过一个电阻给电容器构成一个充电回路,并以电容两端的电压作为响应,就构成了一个以一阶微分方程描述的"一阶系统",它的幅频响应在零频率处及其附近等于或接近于1,随着频率的增加,这个系统的幅频响应逐渐平滑地衰减为零

使用特权

评论回复
14
八层楼| | 2023-5-17 12:20 | 只看该作者
最常用的滤波电路应该是很基本的RC滤波,不管是高通型或是低通型

使用特权

评论回复
15
观海| | 2023-5-17 13:29 | 只看该作者
双T型滤波电路,能够针对特定的音频频率点产生很高的衰减度,用来做简易的音频失真仪更是好用

使用特权

评论回复
16
guanjiaer| | 2023-5-17 14:42 | 只看该作者
理论上如果RC数值搭配准确时,可达到60 dB的衰减度。但是如此Q值太高,会使滤波的有效频宽太窄,容易产生频率偏差

使用特权

评论回复
17
abotomson| | 2023-6-10 15:54 | 只看该作者
根据一阶低通滤波的公式:Yn = (1-alpha)Yn-1 + alphaXn,其中Y为输出,X为输入,n表示当前时刻。可以得到滤波函数的实现方式如上述代码所示。

使用特权

评论回复
18
cemaj| | 2023-6-10 16:14 | 只看该作者
一阶低通滤波是一种简单有效的信号滤波方法,可以通过降低高频成分来平滑信号。

使用特权

评论回复
19
hearstnorman323| | 2023-6-10 16:54 | 只看该作者
在使用滤波器时,需要根据具体的信号特性和应用场景选择合适的滤波器类型和参数,以达到预期的滤波效果。

使用特权

评论回复
20
chenci2013| | 2023-6-10 17:00 | 只看该作者
需要根据具体需求和信号特性选择合适的采样频率和截止频率等参数,以达到更好的滤波效果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

1289

帖子

2

粉丝