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的成分。