简易数字滤波器的C语言实现

该博客展示了如何使用C语言实现简易的数字滤波器,包括高通滤波器和低通滤波器。通过定义不同的窗口函数(汉宁窗、哈明窗),计算滤波器序列,并给出了具体的函数实现。
摘要由CSDN通过智能技术生成

//高通

#include <stdio.h>
#include <math.h>
#include <string.h>
#define fs 22000   //定义与课本相同的采样频率22000Hz 
#define pi 4.0*atan(1.0) 
int high_fliter(double h1[],double w[],double h[],double fH,double fL,int m);  //h[n]就是滤波器 
int windows_hanning(double fh,double fl,double *w);  //输入通带与阻带截止频率   输出w 
int windows_haming(double fh,double fl,double *w);
double div(double up,double down);


// 说明,在高通滤波器中呢,大部分与低通滤波器相同,稍微有修改,一下的是,high_fliter 与 low_fliter 略有所不同,
// 首先,利用高通的 通带截止频率与阻带截止频率 ,计算出相应阻带的频率, 在 在最后 多乘了一个 cos(n*omega0)罢了; 


int main(void)
{
int i,N;
double w[200]={0},h[200]={0},h1[200]={0},z[200]={0};
printf("使用汉宁窗的滤波器序列h[n]为:\n");
N=high_fliter(h1,w,h,8000,6000,0);     //  调用滤波函数,最后一个参数为 0 时,使用 汉宁窗 
for(i=0;i<N;i++)
{
printf("%.4f ",h[i]);          // 打印滤波器序列 

 printf("\n\n使用哈明窗的滤波器序列h[n]为:\n");
memset(w,0,200*sizeof(double));          // 使用过的序列清零 
memset(h1,0,200*sizeof(double)); 
N=high_fliter(h1,w,z,8000,6000,1);     //
for(i=0;i<N;i++)
{
printf("%.4f ",z[i]);

}
int windows_hanning(double fh,double fl,double *w)  
 {
  int TW,N;
  double x;
  int i,j;
  TW=fl-fh;                                      
  x=3.32*fs/TW;            
N=integer(x);                 
for(i=0;i<N;i++)
{
w[i]=0.5+0.5*cos(2*pi*(i-(N-1)/2)/(N-1));    
}
return N;                        
 }
 
 int windows_haming(double fh,do

C语言中,可以使用差分方程的形式来实现IIR数字滤波器。具体的实现步骤如下: 1. 定义滤波器的系数: - b系数:代表前馈(feedforward)系数,即输出与输入直接相关的系数。 - a系数:代表反馈(feedback)系数,即输出与过去输出相关的系数。 2. 初始化滤波器的状态变量: - y:过去输出的值。 - x:过去输入的值。 3. 实现滤波器的差分方程: - 使用循环结构,遍历输入信号的每一个样本。 - 计算当前输出值: `y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[N]*x[n-N] - a[1]*y[n-1] - ... - a[M]*y[n-M]` - 更新状态变量: `x[n-1] = x[n]` `y[n-1] = y[n]` 下面是一个简单的示例代码实现了一个一阶低通IIR数字滤波器: ```c #define N 2 // 前馈系数个数 #define M 1 // 反馈系数个数 float b[N+1] = {0.5, 0.5}; // 前馈系数 float a[M+1] = {1.0, -0.8}; // 反馈系数 float x[N+1] = {0}; // 输入状态变量 float y[M+1] = {0}; // 输出状态变量 float iir_filter(float input) { float output = 0; // 更新输入状态变量 for (int i = N; i > 0; i--) { x[i] = x[i - 1]; } x[0] = input; // 计算输出 for (int i = 0; i <= N; i++) { output += b[i] * x[i]; } for (int i = 1; i <= M; i++) { output -= a[i] * y[i]; } // 更新输出状态变量 for (int i = M; i > 0; i--) { y[i] = y[i - 1]; } y[0] = output; return output; } ``` 请注意,此示例仅演示了一个简单的一阶低通IIR数字滤波器实现。对于更高阶或其他类型的IIR滤波器,需要相应地调整系数和状态变量的数量,并根据具体的滤波器设计进行实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值