C语言 低通滤波器\带通滤波器\高通滤波器

[知识交流]当信号和干扰信号同时存在时,不会发生叠加吗?要如何滤掉干扰信号?

文章发表于:2007-10-21 18:16

这是对滤波的理解有误,滤波不是指滤掉干扰信号的幅值,而是滤掉它的频率。有用信号和干扰信号的频率不同,如果干扰信号的频率高,则用一个低通滤波器滤掉干扰信号,如果信号频率高,则用一个高通滤波器滤掉干扰信号。

MATLAB:

   y(m)=-(a(2)*y(m-1)+a(3)*y(m-2)+a(4)*y(m-3)+a(5)*y(m-4)+a(6)*y(m-5)+a(7)*y(m-6)+a(8)*y(m-7)+a(9)*y(m-8))+(b(1)*x(m)+b(2)*x(m-1)+b(3)*x(m-2)+b(4)*x(m-3)+b(5)*x(m-4)+b(6)*x(m-5)+b(7)*x(m-6)+b(8)*x(m-7)+b(9)*x(m-8));

C语言
以下一个结果:通带 5Hz,1db, 阻带8Hz,40db

b=[0.0117   -0.0329    0.0451   -0.0329    0.0117]
a=[1.0000   -3.6048    4.9787   -3.1156    0.7447]

int        filterBegin=5;
double xBuf[5];
double yBuf[5];
double filter(double x)
{
        //把历史数据保存,算出yBuf[]并返回
        for(int i=4;i>0;i--)
        {
            yBuf[i] = yBuf[i-1]; xBuf[i] = xBuf[i-1];
        }
       xBuf[0] = x;

    if(filterBegin>0)
    {
        filterBegin =0;
       yBuf[0] = x;
       return x;
    }
    yBuf[0] = 0.0117* ( xBuf[0] +xBuf[4])  -0.0329 * (xBuf[1 ]+xBuf[3]) +0.0451*xBuf[2 ]
                -( -3.6048* yBuf[1] + 4.9787*yBuf[2]  -3.1156*yBuf[3] +    0.7447*yBuf[4]);
    return yBuf[0];
}

2、关于FIR带通滤波器的C语言设计程序 代码

 
  
 
  
 
  
 
  
void fir(short x[], short h[], short y[])

{

 int i, j, sum0, sum1;

 short x0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7;  for (j = 0; j < 100; j+=2) {

  sum0 = 0;

  sum1 = 0;

  x0 = x[j];

  for (i = 0; i < 32; i+=8){

   x1 = x[j+i+1];

   h0 = h[i];

   sum0 += x0 * h0;

   sum1 += x1 * h0;

   x2 = x[j+i+2];

   h1 = h[i+1];

   sum0 += x1 * h1;

   sum1 += x2 * h1;

   x3 = x[j+i+3];

   h2 = h[i+2];

   sum0 += x2 * h2;

   sum1 += x3 * h2;

   x4 = x[j+i+4];

   h3 = h[i+3];

   sum0 += x3 * h3;

   sum1 += x4 * h3;

   x5 = x[j+i+5];

   h4 = h[i+4];

   sum0 += x4 * h4;

   sum1 += x5 * h4;

   x6 = x[j+i+6];

   h5 = h[i+5];

   sum0 += x5 * h5;

   sum1 += x6 * h5;

   x7 = x[j+i+7];

   h6 = h[i+6];

   sum0 += x6 * h6;

   sum1 += x7 * h6;

   x0 = x[j+i+8];

   h7 = h[i+7];

   sum0 += x7 * h7;

   sum1 += x0 * h7;

   }

  y[j] = sum0 >> 15;

  y[j+1] = sum1 >> 15;

 }

}

什么是谐波?什么是基波? 

      

最佳答案
谐波是一个数学或物理学概念,指周期函数或周期性的波形中不能用常数、与原函数的最小正周期相同的正弦函数和余弦函数的线性组合表达的部分。
基波:将非正弦周期信号按傅里叶级数展开,频率与原信号频率相同的量。
在电力系统中电压和电流均为周期波形,基波是指频率为50HZ的电压或电流成分,谐波是指频率为50hz整数倍的电压或电流成分,比如3次谐波就是频率为150hz的成分。 
二次谐波
   谐波产生的根本原因是由于非线性负载所致。当电流流经负载时,与所加的电压不呈线性关系,就形成非正弦电流,从而产生谐波。谐波频率是基波频率的整倍数,根据法国数学家傅立叶(M.Fourier)分析原理证明,任何重复的波形都可以分解为含有基波频率和一系列为基波倍数的谐波的正弦波分量。谐波是正弦波,每个谐波都具有不同的频率,幅度与相角。谐波可以I区分为偶次与奇次性,第3、5、7次编号的为奇次谐波,而2、4、6、8等为偶次谐波,如基波为50Hz时,2次谐波为l00Hz,3次谐波则是150Hz。

基波

  jībō   〖fundamentalwave〗  复合波的最低频率分量。  在复杂的周期性振荡中,包含基波和 谐波。和该振荡最长周期相等的正弦波分量称为基波。相应于这个周期的频率称为 基本频率。频率等于基本频率的整倍数的正弦波分量称为谐波。
 

通带截止频率

  是滤波器中的带通滤波器的截止频率。带通滤波器是只允许ƒ1——ƒ2间的频率成分通过,其他频率成分衰减为零。
  

C语言 <wbr>低通滤波器\带通滤波器\高通滤波器

4种滤波器的幅频特性


截止频率

  幅频特性值等于A0的根2倍所对应的频率称为滤波器的截   止频率。

C语言 <wbr>低通滤波器\带通滤波器\高通滤波器


 
float DigFil(invar, setic) float invar; int setic; /******************************************************************************/ /* Filter Solutions Version 2009 Nuhertz Technologies, L.L.C. */ /* www.nuhertz.com */ /* +1 602-279-2448 */ /* 3rd Order Band Pass Butterworth */ /* Bilinear Transformation with Prewarping */ /* Sample Frequency = 5.000 KHz */ /* Standard Form */ /* Arithmetic Precision = 4 Digits */ /* */ /* Center Frequency = 300.0 Rad/Sec */ /* Pass Band Width = 20.00 Rad/Sec */ /* */ /******************************************************************************/ /* */ /* Input Variable Definitions: */ /* Inputs: */ /* invar float The input to the filter */ /* setic int 1 to initialize the filter to zero */ /* */ /* Option Selections: */ /* Standard C; Initializable; Internal States; Not Optimized; */ /* */ /* There is no requirement to ever initialize the filter. */ /* The default initialization is zero when the filter is first called */ /* */ /******************************************************************************/ /* */ /* This software is automatically generated by Filter Solutions */ /* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and */ /* distributions of this software. */ /* */ /******************************************************************************/ { float sumnum=0.0, sumden=0.0; int i=0; static float states[6] = {0.0,0.0,0.0,0.0,0.0,0.0}; static float znum[7] = { -7.968e-09, 0.0, 2.39e-08, 0.0, -2.39e-08, 0.0, 7.968e-09 }; static float zden[6] = { .992, -5.949, 14.88, -19.86, 14.92, -5.981 }; if (setic==1){ for (i=0;i<6;i++) states[i] = [i] = [i]*invar; return 0.0; } else{ sumnum = sumden = 0.0; for (i=0;i<6;i++){ sumden += states[i]*zden[i]; sumnum += states[i]*znum[i]; if (i<5) states[i] = states[i+1]; } states[5] = invar-sumden; sumnum += states[5]*znum[6]; return sumnum; } }
C语言实现一阶高通滤波需要先确定截止频率、采样频率以及滤波器类型。假设我们要实现的是Butterworth高通滤波器,可以按照以下步骤实现: 1. 确定截止频率和采样频率,计算出对应的数字滤波器频率。 2. 根据截止频率和数字滤波器频率计算出对应的模拟滤波器参数,比如通带增益、截止频率等。 3. 将模拟滤波器参数转化为数字滤波器参数,比如利用双线性变换等方法。 4. 实现数字滤波器的差分方程,可以采用直接IIR结构、间接IIR结构、FIR结构等。 下面是一个简单的一阶Butterworth高通滤波器C语言代码实现: ``` #define PI 3.141592653589793 typedef struct { float b0, b1; float a1; float x1, y1; } HIGHPASS; void highpass_init(HIGHPASS *hpf, float cutoff_freq, float sample_rate) { float w0 = 2.0 * PI * cutoff_freq / sample_rate; float alpha = sin(w0) / (2.0 * Q); hpf->b0 = (1.0 + cos(w0)) / 2.0; hpf->b1 = -(1.0 + cos(w0)); hpf->a1 = (1.0 - alpha); hpf->x1 = 0.0; hpf->y1 = 0.0; } float highpass_filter(HIGHPASS *hpf, float x) { float y = hpf->b0 * x + hpf->b1 * hpf->x1 - hpf->a1 * hpf->y1; hpf->x1 = x; hpf->y1 = y; return y; } ``` 其中,HIGHPASS结构体表示一阶高通滤波器,包含了数字滤波器的系数以及状态变量。高通滤波器的初始化函数highpass_init根据截止频率和采样频率计算出数字滤波器的系数,并初始化状态变量。高通滤波器的滤波函数highpass_filter根据输入信号x和状态变量计算出输出信号y,并更新状态变量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值