
这个我刚好做过一个滤波器,事实上对时域信号做FFT,截取一定点数再做逆FFT相当于理想滤波。设计滤波器代码如下:
f1=100;f2=200;%待滤波正弦信号频率
fs=2000;%采样频率
m=(03f1)/(fs/2);%定义过度带宽
M=round(8/m);%定义窗函数的长度
N=M-1;%定义滤波器的阶数
b=fir1(N,f2/fs);%使用fir1函数设计滤波器
%输入的参数分别是滤波器的阶数和截止频率
figure(1)
[h,f]=freqz(b,1,512);%滤波器的幅频特性图
%[H,W]=freqz(B,A,N)当N是一个整数时函数返回N点的频率向量和幅频响应向量
plot(ffs/(2pi),20log10(abs(h)))%参数分别是频率与幅值
xlabel('频率/赫兹');ylabel('增益/分贝');title('滤波器的增益响应');
figure(2)
subplot(211)
t=0:1/fs:05;%定义时间范围和步长
s=sin(2pif1t)+sin(2pif2t);%滤波前信号
plot(t,s);%滤波前的信号图像
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
subplot(212)
Fs=fft(s,512);%将信号变换到频域
AFs=abs(Fs);%信号频域图的幅值
f=(0:255)fs/512;%频率采样
plot(f,AFs(1:256));%滤波前的信号频域图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
figure(3)
sf=filter(b,1,s);%使用filter函数对信号进行滤波
%参数分别为滤波器系统函数的分子和分母多项式系数向量和待滤波信号输入
subplot(211)
plot(t,sf)%滤波后的信号图像
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
axis([02 05 -2 2]);%限定图像坐标范围
subplot(212)
Fsf=fft(sf,512);%滤波后的信号频域图
AFsf=abs(Fsf);%信号频域图的幅值
f=(0:255)fs/512;%频率采样
plot(f,AFsf(1:256))%滤波后的信号频域图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');
1 void fir(short x[], short h[], short y[]) { int i, j, sum; for (j = 0; j < 100; j++) { sum = 0; for (i = 0; i < 32; i++) sum += x[i+j] h[i]; y[j] = sum >> 15; } } 2 void fir(short x[], short h[], short y[]) { int i, j, sum0, sum1; short x0,x1,h0,h1; for (j = 0; j < 100; j+=2) { sum0 = 0; sum1 = 0; x0 = x[j]; for (i = 0; i < 32; i+=2){ x1 = x[j+i+1]; h0 = h[i]; sum0 += x0 h0; sum1 += x1 h0; x0 = x[j+i+2]; h1 = h[i+1]; sum0 += x1 h1; sum1 += x0 h1; } y[j] = sum0 >> 15; y[j+1] = sum1 >> 15; } } 3 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; } }
给你“rinvc ”
不知道是不是你要的,随便找了个数值分析算法里头的
#include "stdlibh"
#include "mathh"
#include "stdioh"
int rinv(n,a)
int n;
double a[];
{ int is,js,i,j,k,l,u,v;
double d,p;
is=malloc(nsizeof(int));
js=malloc(nsizeof(int));
for (k=0; k=n-1; k++)
{ d=00;
for (i=k; i=n-1; i++)
for (j=k; j=n-1; j++)
{ l=in+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+10==10)
{ free(is); free(js); printf("errnot inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j=n-1; j++)
{ u=kn+j; v=is[k]n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i=n-1; i++)
{ u=in+k; v=in+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=kn+k;
a[l]=10/a[l];
for (j=0; j=n-1; j++)
if (j!=k)
{ u=kn+j; a[u]=a[u]a[l];}
for (i=0; i=n-1; i++)
if (i!=k)
for (j=0; j=n-1; j++)
if (j!=k)
{ u=in+j;
a[u]=a[u]-a[in+k]a[kn+j];
}
for (i=0; i=n-1; i++)
if (i!=k)
{ u=in+k; a[u]=-a[u]a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j=n-1; j++)
{ u=kn+j; v=js[k]n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i=n-1; i++)
{ u=in+k; v=in+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}
#include <stdioh>
#ifdef WIN32
#include <conioh>
#endif
#define SAMPLE double / define the type used for data samples /
void clear(int ntaps, SAMPLE z[])
{
int ii;
for (ii = 0; ii < ntaps; ii++) {
z[ii] = 0;
}
}
SAMPLE fir_basic(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[])
{
int ii;
SAMPLE accum;
/ store input at the beginning of the delay line /
z[0] = input;
/ calc FIR /
accum = 0;
for (ii = 0; ii < ntaps; ii++) {
accum += h[ii] z[ii];
}
/ shift delay line /
for (ii = ntaps - 2; ii >= 0; ii--) {
z[ii + 1] = z[ii];
}
return accum;
}
SAMPLE fir_circular(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],
int p_state)
{
int ii, state;
SAMPLE accum;
state = p_state; / copy the filter's state to a local /
/ store input at the beginning of the delay line /
z[state] = input;
if (++state >= ntaps) { / incr state and check for wrap /
state = 0;
}
/ calc FIR and shift data /
accum = 0;
for (ii = ntaps - 1; ii >= 0; ii--) {
accum += h[ii] z[state];
if (++state >= ntaps) { / incr state and check for wrap /
state = 0;
}
}
p_state = state; / return new state to caller /
return accum;
}
SAMPLE fir_shuffle(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[])
{
int ii;
SAMPLE accum;
/ store input at the beginning of the delay line /
z[0] = input;
/ calc FIR and shift data /
accum = h[ntaps - 1] z[ntaps - 1];
for (ii = ntaps - 2; ii >= 0; ii--) {
accum += h[ii] z[ii];
z[ii + 1] = z[ii];
}
return accum;
}
SAMPLE fir_split(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],
int p_state)
{
int ii, end_ntaps, state = p_state;
SAMPLE accum;
SAMPLE const p_h;
SAMPLE p_z;
/ setup the filter /
accum = 0;
p_h = h;
/ calculate the end part /
p_z = z + state;
p_z = input;
end_ntaps = ntaps - state;
for (ii = 0; ii < end_ntaps; ii++) {
accum += p_h++ p_z++;
}
/ calculate the beginning part /
p_z = z;
for (ii = 0; ii < state; ii++) {
accum += p_h++ p_z++;
}
/ decrement the state, wrapping if below zero /
if (--state < 0) {
state += ntaps;
}
p_state = state; / return new state to caller /
return accum;
}
SAMPLE fir_double_z(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],
int p_state)
{
SAMPLE accum;
int ii, state = p_state;
SAMPLE const p_h, p_z;
/ store input at the beginning of the delay line as well as ntaps more /
z[state] = z[state + ntaps] = input;
/ calculate the filter /
p_h = h;
p_z = z + state;
accum = 0;
for (ii = 0; ii < ntaps; ii++) {
accum += p_h++ p_z++;
}
/ decrement state, wrapping if below zero /
if (--state < 0) {
state += ntaps;
}
p_state = state; / return new state to caller /
return accum;
}
SAMPLE fir_double_h(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],
int p_state)
{
SAMPLE accum;
int ii, state = p_state;
SAMPLE const p_h, p_z;
/ store input at the beginning of the delay line /
z[state] = input;
/ calculate the filter /
p_h = h + ntaps - state;
p_z = z;
accum = 0;
for (ii = 0; ii < ntaps; ii++) {
accum += p_h++ p_z++;
}
/ decrement state, wrapping if below zero /
if (--state < 0) {
state += ntaps;
}
p_state = state; / return new state to caller /
return accum;
}
int main(void)
{
#define NTAPS 6
static const SAMPLE h[NTAPS] = { 10, 20, 30, 40, 50, 60 };
static SAMPLE h2[2 NTAPS];
static SAMPLE z[2 NTAPS];
#define IMP_SIZE (3 NTAPS)
static SAMPLE imp[IMP_SIZE];
SAMPLE output;
int ii, state;
/ make impulse input signal /
clear(IMP_SIZE, imp);
imp[5] = 10;
/ create a SAMPLEd h /
for (ii = 0; ii < NTAPS; ii++) {
h2[ii] = h2[ii + NTAPS] = h[ii];
}
/ test FIR algorithms /
printf("Testing fir_basic:\n ");
clear(NTAPS, z);
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_basic(imp[ii], NTAPS, h, z);
printf("%31lf ", (double) output);
}
printf("\n\n");
printf("Testing fir_shuffle:\n ");
clear(NTAPS, z);
state = 0;
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_shuffle(imp[ii], NTAPS, h, z);
printf("%31lf ", (double) output);
}
printf("\n\n");
printf("Testing fir_circular:\n ");
clear(NTAPS, z);
state = 0;
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_circular(imp[ii], NTAPS, h, z, &state);
printf("%31lf ", (double) output);
}
printf("\n\n");
printf("Testing fir_split:\n ");
clear(NTAPS, z);
state = 0;
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_split(imp[ii], NTAPS, h, z, &state);
printf("%31lf ", (double) output);
}
printf("\n\n");
printf("Testing fir_double_z:\n ");
clear(2 NTAPS, z);
state = 0;
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_double_z(imp[ii], NTAPS, h, z, &state);
printf("%31lf ", (double) output);
}
printf("\n\n");
printf("Testing fir_double_h:\n ");
clear(NTAPS, z);
state = 0;
for (ii = 0; ii < IMP_SIZE; ii++) {
output = fir_double_h(imp[ii], NTAPS, h2, z, &state);
printf("%31lf ", (double) output);
}
#ifdef WIN32
printf("\n\nHit any key to continue");
getch();
#endif
return 0;
}
1 fir_basic: 实现基本的FIR滤波器
2 fir_circular: 说明环行buffer是如何实现FIR的。
3 fir_shuffle: 一些TI的处理器上使用的shuffle down技巧
4 fir_split: 把FIR滤波器展开为两块,避免使用环行缓存。
5 fir_double_z: 使用双精度的延迟线,使可以使用一个flat buffer。
6 fir_double_h: 使用双精度的系数,使可以使用一个flat buffer。
/ 6th Order Low Pass Butterworth /
/ Bilinear Transformation with Prewarping /
/ Sample Frequency = 1000 Hz /
/ Standard Form /
/ Arithmetic Precision = 4 Digits /
/ /
/ Pass Band Frequency = 3500 Hz /
/ /
//
/ /
/ Input Variable Definitions: /
/ Inputs: /
/ invar float The input to the filter /
/ initvar float The initial value of the filter /
/ setic int 1 to initialize the filter to the value of initvar /
/ /
/ There is no requirement to ever initialize the filter /
/ The default initialization is zero when the filter is first called /
float DigFil(invar, initval, setic)
float invar, initval; int setic;
{
float sumnum, sumden; int i;
static float delay[7] = {00,00,00,00,00,00,00};
static float znum[7] = {
1477,
8864,
2216,
2955,
2216,
8864,
1477
};
static float zden[6] = {
2183e-02,
2099,
8779,
2055,
291,
238
};
if (setic==1){
for (i=0;i<=6;i++) delay[i] = 1058initval;
return initval;
}
else{
sumden=00;
sumnum=00;
for (i=0;i<=5;i++){
delay[i] = delay[i+1];
sumden += delay[i]zden[i];
sumnum += delay[i]znum[i];
}
delay[6] = invar-sumden;
sumnum += delay[6]znum[6];
return sumnum;
}
}
[KEST,L,P
=卡尔曼(SYS,青年,护士,NN)
卡尔曼滤波器的信号模型
X(K)=
A
X(k-1)+
W(K)
/>
Y(K)=
C
X(K)+
V(K)
W和V上的两个W和V
E
{WW“
}
=
QN,这是系统噪声的协方差矩阵;
E
{VV'}
=
RN,测量噪声的协方差矩阵;
E
{WV'}
=
NN,这一下应该从字面上相互系统的噪声和观测噪声的协方差矩阵;
白噪声均值为0,所以上述的几个值的自相关和互相关函数;
系统给定的系统模型;
以上就是关于一段matlab低通滤波器程序,求改编成C语言。全部的内容,包括:一段matlab低通滤波器程序,求改编成C语言。、各位好心人帮帮忙,谁能给我段基于c语言fir滤波器设计的程序代码啊。急急急!!!!!、C语言下的卡尔曼滤波程序,编译有错啊,比如 #include "rinv.c"这个文件在哪儿还有整个程序没有函数体等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)