iir滤波器c语言
❶ 什么是 IIR数字滤波器
IIR是”Infinite Impulse Response“的意思,所以IIR数字滤波器,又名“无限脉冲响应数字滤波器”,或“递归滤波器”。
❷ 学长 我想设计一个基于ccs环境下的IIR滤波器 想让你给设计一个程序 c语言的 自己设计的运行时出错 谢谢啦
低通、高通、带通、带阻、全通,你想要什么类型的,设计参数都没有!
❸ 二阶滤波器用C语言怎么写
这个可比你想象的复杂多了,s是个复变量,1/(s+1)极点在-1,要想用C语言写,必须理解清楚下面几个问题:
1、输入必须是个有限序列,比如(x+yi),x和y分别是两个长度为N的数组
2、要过滤的频率,必须是个整型值,或者是个整型区间
3、输出结果同样是两个长度为N的数组(p+qi)
4、整个程序需要使用最基本的复数运算,这一点C语言本身不提供,必须手工写复函数运算库
5、实现的时候具体算法还需要编,这里才是你问题的核心。
我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差别很大:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "complex.h"
extern "C" {
// Discrete Fourier Transform (Basic Version, Without Any Enhancement)
// return - Without Special Meaning, constantly, zero
int DFT (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);
CComplex F, X, T, W; int n, i;
long N = abs(count); long Inversing = count < 0? 1: -1;
for(n = 0; n < N ; n++){ // compute from line 0 to N-1
F = CComplex(0.0f, 0.0f); // clear a line
for(i = 0; i < N; i++) {
T = input[i];
W = HarmonicPI2(Inversing * n * i, N);
X = T * W;
F += X; // fininshing a line
}//next i
// save data to outpus
memcpy(output + n, &F, sizeof(F));
}//next n
return 0;
}//end DFT
int fft (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);
int N = abs(count); long Inversing = count < 0? -1: 1;
if (N % 2 || N < 5) return DFT(count, input, output);
long N2 = N / 2;
CComplex * iEven = new CComplex[N2]; memset(iEven, 0, sizeof(CComplex) * N2);
CComplex * oEven = new CComplex[N2]; memset(oEven, 0, sizeof(CComplex) * N2);
CComplex * iOdd = new CComplex[N2]; memset(iOdd , 0, sizeof(CComplex) * N2);
CComplex * oOdd = new CComplex[N2]; memset(oOdd , 0, sizeof(CComplex) * N2);
int i = 0; CComplex W;
for(i = 0; i < N2; i++) {
iEven[i] = input[i * 2];
iOdd [i] = input[i * 2 + 1];
}//next i
fft(N2 * Inversing, iEven, oEven);
fft(N2 * Inversing, iOdd, oOdd );
for(i = 0; i < N2; i++) {
W = HarmonicPI2(Inversing * (- i), N);
output[i] = oEven[i] + W * oOdd[i];
output[i + N2] = oEven[i] - W * oOdd[i];
}//next i
return 0;
}//end FFT
void __stdcall FFT(
long N, // Serial Length, N > 0 for DFT, N < 0 for iDFT - inversed Discrete Fourier Transform
double * inputReal, double * inputImaginary, // inputs
double * AmplitudeFrequences, double * PhaseFrequences) // outputs
{
if (N == 0) return;
if (!inputReal && !inputImaginary) return;
short n = abs(N);
CComplex * input = new CComplex[n]; memset(input, 0, sizeof(CComplex) * n);
CComplex * output= new CComplex[n]; memset(output,0, sizeof(CComplex) * n);
double rl = 0.0f, im = 0.0f; int i = 0;
for (i = 0; i < n; i++) {
rl = 0.0f; im = 0.0f;
if (inputReal) rl = inputReal[i];
if (inputImaginary) im = inputImaginary[i];
input[i] = CComplex(rl, im);
}//next i
int f = fft(N, input, output);
double factor = n;
//factor = sqrt(factor);
if (N > 0)
factor = 1.0f;
else
factor = 1.0f / factor;
//end if
for (i = 0; i < n; i++) {
if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor;
if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor;
}//next i
delete [] output;
delete [] input;
return ;
}//end FFT
int __cdecl main(int argc, char * argv[])
{
fprintf(stderr, "%s usage:\n", argv[0]);
fprintf(stderr, "Public Declare Sub FFT Lib \"wfft.exe\" \
(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \
ByRef freqAmplitude As Double, ByRef freqPhase As Double)");
return 0;
}//end main
};//end extern "C"
❹ FIR、IIR滤波器程序
fp=500; fs=750; % 设置滤波器的通带和阻带频率
Fs=8000; Fs2=Fs/2; % 采样频率
Wp=fp/Fs2; Ws=fs/Fs2; % 把通带和阻带频率归一化
Rp=3; Rs=50; % 通带波纹和阻带衰减
[n,Wn]=cheb2ord(Wp,Ws,Rp,Rs); % 求取滤波器阶数
[b,a]=cheby2(n,Rs,Wn); % 设计契比雪夫II型低通滤波器系数
[db,mag,pha,grd,w]=freqz_m(b,a); % 求滤波器的频率响应曲线
这是iir低通,,高通,带通类似
❺ 二阶通用滤波器用C语言怎么编程
shorth[],shorty[]){inti,j,sum;for(j=0;j>15;}}2voidfir(shortx[],shorth[],shorty[]){inti,j,sum0,sum1;shortx0,x1,h0,h1;for(j=0;j>15;y[j+1]=sum1>>15;}}3voidfir(shortx[],shorth[],shorty[]){inti,j,sum0,sum1;shortx0,x1,x2,x3,x4,x5,x6,x7,h0,h1,h2,h3,h4,h5,h6,h7;for(j=0;j>15;y[j+1]=sum1>>15;}}
❻ IIR数字滤波器与FIR数字滤波器的定义
无限脉冲响应滤波器是数位滤波器的一种,简称IIR数位滤波器(infinite impulse response filter)。由于无限脉冲响应滤波器中存在反馈回路,因此对于脉冲输入信号的响应是无限延续的。
有限脉冲响应滤波器是数字滤波器的一种,简称FIR数字滤波器(finite impulse response filter)。这类滤波器对于脉冲输入信号的响应最终趋向于0,因此是有限的,而得名。它是相对于无限脉冲响应滤波器(IIR)而言。
有限脉冲响应滤波器(FIR filter)的优点:
1. 脉冲响应(impulse response)为有限长:造成当输入数位讯号为有限长的时候,输出数位讯号也为有限长。
2. 比无限脉冲响应滤波器(IIR filter)较容易最佳化(optimize)。
3. 线性相位(linear phase):造成h(n)\,是偶对称(even)或奇对称(odd)且有限长。
4. 一定是稳定的(stable):因为Z转换(Z transform)后所有的极点(pole)都在单位圆内。
有限脉冲响应滤波器(FIR filter)的缺点:
设计方式较无限脉冲响应滤波器(IIR filter)不容易。
无限脉冲响应滤波器(IIR filter)的优点:
较容易设计以及实现。
无限脉冲响应滤波器(IIR filter)的缺点:
1. 脉冲响应(impulse response)为无限长:造成当输入数位讯号为有限长的时候,输出数位讯号会变成无限长。
2. 比有限脉冲响应滤波器(FIR filter)较不易最佳化(optimize)。
3. 不一定是稳定的(stable):因为Z转换(Z transform)后所有的极点(pole)不一定都在单位圆内。
reference:w开头的被屏蔽的某网站
❼ 求IIR及FIR数字滤波器的C语言实现。(VC++)
这个问题比较复杂,最近本人也在研究数字滤波,
结合图片说一下
第一个图是fir的流程图,其中Z-1是延迟,是单个采样时间1/fs
n阶的fir滤波器就是选取最近的n+1个样本,然后使他们各自乘以自己的滤波器系数即图中的F(n),[一般其他书的表示是h(n)]
然后相加得到输出的y(n)就是一个输出点
,其中F(n)的得出需要根据采样频率和滤波器的通带和阻带来决定
其中为了改善旁瓣的幅值,一般在采样后给样本或者h(n)加窗,当然可以用“最佳方法”来做
得出h(n)大致方法是先将矩形窗进行DFT,得出h(n),然后对h(n)进行加窗得出h(k),然后将∑h(k)×x(n)=y(n),假如阶数较多可以用傅里叶变换使时域变频域后再将卷积相加,可以利用FFT来改进实时性,提升速度
上面就是fir滤波器的简述
第二个图片上传不了,直接给链接
http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7&in=12708&cl=2&cm=1&sc=0&lm=-1&pn=0&rn=1&di=2607528304&ln=1054&fr=
图中的Z-1是延时,iir滤波器也叫无限冲击响应滤波器,是有反馈的,
图中的是一阶的,相对fir滤波器来说,iir滤波器可以用较低的阶数来获得较好的滤波特效。但是其相位特性较差。
鉴于实用性,还是建议楼主去图书馆借书看,网络不可能得到确实的方案,
楼主可以去借“数字信号处理”的书,国外的中译本就有详细介绍fir和iir以及fft还有其他变换,国内的dsp大都几乎是dsp用户手册的中译本,对上述问题都是很简陋地带过,不予置评。
本人推荐一本书在www.ouravr.com上面的dsp专栏有下载,40多M,叫DSP算法、应用和设计,本人有这本实体书,写的较好
❽ 若已知相应的传递函数如何用C语言写出FIR和IIR数字滤波器(最好有一个例子)。谢谢各位大侠了
以我的理解,你要使用反变换得到滤波器的脉冲响应函数,这样才好运算
❾ IIR滤波器有什么特点
iir滤波器有以下几个特点:
【1】 iir数字滤波器的系统函数可以写成封闭函数的形式。
【2】 iir数字滤波器采用递归型结构,即结构上带有反馈环路。iir滤波器运算结构通常由延时、乘以系数和相加等基本运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。
【3 】iir数字滤波器在计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,其设计工作量比较小,对计算工具的要求不高。在设计一个iir数字滤波器时,我们根据指标先写出模拟滤波器的公式,然后通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。
【4 】iir数字滤波器的相位特性不好控制,对相位要求较高时,需加相位校准网络。
你好,很高兴为你解答,希望对你有所帮助,若满意请及时采纳。
这真的很难一下子说明白最好上硬之城看看吧。