线性卷积:
#include <math.h>
int N1,N2;
int n;
int m,i,k;
float x[20];
float h[20];
float y[20];
main()
{
N1=10;
N2=10;
n=N1+N2-1;
for(i=0;i<20;i++)
{
x[i]=0;
h[i]=0;
y[i]=0;
}
for(i=0;i<n;i++)
{
if(i<N1)
{
x[i]=i;
}
else
{
x[i]=0;
}
}
for(i=0;i<=n;i++)
{
if(i<N2)
{
h[i]=1;
}
else
{
h[i]=0;
}
}
for(i=0;i<n;i++)
{
for (k=0;k<=i;k++)
y[i]=y[i]+h[k]*x[i-k];
}
}
N点FFT:
#include <math.h>
#include <stdio.h>
const float pi=3.1415926;
int N;
float x_re[300], x_im[300];
float y_re[300], y_im[300];
float w_re, w_im;
int m;
float t_re, t_im, v_re, v_im;
int j,i,k,f,n;
int a, b, c;
main()
{
N=64;
for(i=0; i<300; i++)
{
x_re[i]=0;
x_im[i]=0;
}
for(i=0;i<=N;i++)
{
x_re[i]=exp(-i);
x_im[i]=0;
}
for(i=0; i<300; i++)
{
y_re[i]=x_re[i];
y_im[i]=x_im[i];
}
j=0;
for(i=0;i<N;i++)
{
if(i<j)
{
t_re=y_re[j];
t_im=y_im[j];
y_re[j]=y_re[i];
y_im[j]=y_im[i];
y_re[i]=t_re;
y_im[i]=t_im;
}
k=N/2;
while((k<=j)&(k>0))
{
j=j-k;
k=k/2;
}
j=j+k;
}
f=N;
for(m=1; (f=f/2)!=1; m++);
for(n=1; n<=m; n++)
{
a=1;
for(i=0;i<n;i++)
a=a*2;
b=a/2;
v_re=1.0;
v_im=0.0;
w_re=cos(pi/b);
w_im=-sin(pi/b);
for(j=0;j<b;j++)
{
for(i=j;i<N;i=i+a)
{
c=i+b;
t_re=y_re[c]*v_re-y_im[c]*v_im;
t_im=y_re[c]*v_im+y_im[c]*v_re;
y_re[c]=y_re[i]-t_re;
y_im[c]=y_im[i]-t_im;
y_re[i]=y_re[i]+t_re;
y_im[i]=y_im[i]+t_im;
}
t_re=v_re*w_re-v_im*w_im;
t_im=v_re*w_im+v_im*w_re;
v_re=t_re;
v_im=t_im;
}
}
}
相关估计:
#include "math.h"
float x[50],y[50];
float r[50];
int mode;
int m;
int n;
int k;
int i,j;
float sum;
main()
{
mode=0;
m=10;
n=40;
k=0;
sum=0;
for(i=0;i<50;i++)
{
x[i]=0;
y[i]=0;
r[i]=0;
}
for(i=0;i<n;i++)
{
x[i]=1;
y[i]=i;
}
for(k=0;k<m;k++)
{
sum=0;
for(j=0;j<n-k;j++)
{
sum=sum+x[j+k]*y[j];
}
if(mode==0)
{
r[k]=sum/(float)(n-k);
}
else
{
r[k]=sum/(float)n;
}
}
}
离散余弦变换:
#include <math.h>
#include <stdio.h>
const float pi=3.1415926;
int N;
int N2;
float x_re[300], x_im[300];
float y_re[300], y_im[300];
float ck[300];
float w_re, w_im;
int m;
float t_re, t_im, v_re, v_im;
int j,i,k,f,n;
int a, b, c;
main()
{
N=8;
N2=2*N;
for(i=0; i<300; i++)
{
x_re[i]=0;
x_im[i]=0;
ck[i]=0;
}
for(i=0;i<N;i++)
{
x_re[i]=exp(-i);
x_im[i]=0;
}
for(i=N;i<N2;i++);
for(i=0; i<300; i++)
{
y_re[i]=x_re[i];
y_im[i]=x_im[i];
}
j=0;
for(i=0;i<N2;i++)
{
if(i<j)
{
t_re=y_re[j];
t_im=y_im[j];
y_re[j]=y_re[i];
y_im[j]=y_im[i];
y_re[i]=t_re;
y_im[i]=t_im;
}
k=N2/2;
while((k<=j)&(k>0))
{
j=j-k;
k=k/2;
}
j=j+k;
}
f=N2;
for(m=1; (f=f/2)!=1; m++);
for(n=1; n<=m; n++)
{
a=1;
for(i=0;i<n;i++)
a=a*2;
b=a/2;
v_re=1.0;
v_im=0.0;
w_re=cos(pi/b);
w_im=-sin(pi/b);
for(j=0;j<b;j++)
{
for(i=j;i<N2;i=i+a)
{
c=i+b;
t_re=y_re[c]*v_re-y_im[c]*v_im;
t_im=y_re[c]*v_im+y_im[c]*v_re;
y_re[c]=y_re[i]-t_re;
y_im[c]=y_im[i]-t_im;
y_re[i]=y_re[i]+t_re;
y_im[i]=y_im[i]+t_im;
}
t_re=v_re*w_re-v_im*w_im;
t_im=v_re*w_im+v_im*w_re;
v_re=t_re;
v_im=t_im;
}
}
for(i=0;i<N;i++)
{
ck[0]=ck[0]+x_re[i];
}
ck[0]=ck[0]/sqrt((float)N);
for(i=1;i<N;i++)
{
ck[i]=cos((i*pi)/N2)*y_re[i]-sin(-(i*pi)/N2)*y_im[i];
ck[i]=sqrt(2.0/N)*ck[i];
}
}
IIR滤波器:
#include <math.h>
#include <stdlib.h>
#define pi 3.1415925
float fp,fr,fs;
float ap, ar;
float ptr_a[50],ptr_b[50];
float hwdb[50];
float b_real[50],b_imag[50];
float b1_real[50],b1_imag[50],b2_real[50],b2_imag[50];
float d[50],e[50],g[50];
float f1[2],f2[2],h[50];
void bcg(float ap,float as,float wp,float ws,int *n,float *h)
{
int i,k;
float a,p,wc,cs1,cs2;
float c;
c=(pow(10.0,0.1*as)-1.0)/(pow(10.0,0.1*ap)-1.0);
*n=(int)(fabs(log10(c)/log10(ws/wp)/2.0)+0.99999);
wc=wp;
a=pow(wc,(double)(*n));
for(i=0;i<*n;i++)
{
p=pi*(0.5+(2.0*i+1.0)/(2.0*(*n)));
b_real[i]=wc*cos(p);
b_imag[i]=wc*sin(p);
}
b1_real[0]=-(b_real[0]);
b1_imag[0]=-(b_imag[0]);
b1_real[1]=1.0;
b1_imag[1]=0.0;
if(*n!=1)
{
for(i=1;i<*n;i++)
{
for(k=0;k<i;k++)
{
cs1=b1_real[k]-b1_real[k+1]*b_real[i];
cs2=b1_imag[k]-b1_real[k+1]*b_imag[i];
b2_real[k+1]=cs1+b1_imag[k+1]*b_imag[i];
b2_imag[k+1]=cs2-b1_imag[k+1]*b_real[i];
}
b2_real[0]=-(b1_real[0]*b_real[i]-b1_imag[0]*b_imag[i]);
b2_imag[0]=-(b1_real[0]*b_imag[i]+b1_imag[0]*b_real[i]);
b2_real[i+1]=b1_real[i];
b2_imag[i+1]=b1_imag[i];
for(k=0;k<=i+1;k++)
{
b1_real[k]=b2_real[k];
b1_imag[k]=b2_imag[k];
b2_real[k]=0.0;
b2_imag[k]=0.0;
}
}
}
for(i=0;i<=*n;i++)
h[i]=b1_real[i]/a;
}
void pnpe(float *a,int m,int n,float *b,int *mn)
{
int i,j,k,nk;
float c[50];
*mn=m*n;
for(i=0;i<*mn+1;i++)
{
c[i]=0;
b[i]=0;
}
if(n==0)
b[0]=1.00;
else
{
for(i=0;i<=m;i++)
b[i]=a[i];
if(n==1)
{
for(i=0;i<=m;i++)
b[i]=a[i];
}
else
{
nk=m+1;
for(i=1;i<n;i++)
{
for(j=0;j<=m;j++)
{
for(k=0;k<nk;k++)
c[k+j]+=a[j]*b[k];
}
nk+=m;
for(k=0;k<nk;k++)
{
b[k]=c[k];
c[k]=0;
}
}
}
}
}
void ypmp(float *a,int m,float *b,int n,float *c,int *mn)
{
int i,j;
*mn=m+n;
for(i=0;i<*mn+1;i++)
c[i]=0;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
c[i+j]+=a[i]*b[j];
}
}
void bsf(float *c,int ni,float *f1,float *f2,int nf,float *ptr_a,float *ptr_b,int *no)
{
int i,j,nd,ne,ng;
pnpe(f2,nf,ni,ptr_a,no);
for(i=0;i<*no+2;i++)
ptr_b[i]=0;
for(i=0;i<=ni;i++)
{
pnpe(f1,nf,i,d,&nd);
pnpe(f2,nf,ni-i,e,&ne);
ypmp(d,nd,e,ne,g,&ng);
for(j=0;j<=ng;j++)
ptr_b[j]+=c[i]*g[j];
}
}
main()
{
int N,nf,ns,nz,i,k;
float hwdb1_real,hwdb1_imag;
float hwdb2_real,hwdb2_imag;
float wp,ws,jw,amp1,amp2;
N=50;
for(i=0;i<50;i++)
{
b_real[i]=0;
b_imag[i]=0;
b1_real[i]=0;
b1_imag[i]=0;
b2_real[i]=0;
b2_imag[i]=0;
d[i]=0;
e[i]=0;
g[i]=0;
ptr_a[i]=0;
ptr_b[i]=0;
hwdb[i]=0;
}
fp=100;
fr=300;
fs=1000;
ap=3;
ar=20;
wp=tan(pi*fp/fs);
ws=tan(pi*fr/fs);
*f1=-1.0;
*(f1+1)=1.0;
*f2=1.0;
*(f2+1)=1.0;
nf=1;
bcg(ap,ar,wp,ws,&ns,h);
bsf(h,ns,f1,f2,nf,ptr_b,ptr_a,&nz);
for(k=0;k<N;k++)
{
jw=k*pi/N;
hwdb1_real=0; hwdb1_imag=0;
hwdb2_real=0; hwdb2_imag=0;
for(i=0;i<=nz;i++)
{
hwdb1_real+=ptr_b[i]*cos(i*jw);
hwdb1_imag+=ptr_b[i]*sin(i*jw);
hwdb2_real+=ptr_a[i]*cos(i*jw);
hwdb2_imag+=ptr_a[i]*sin(i*jw);
}
amp1=(pow(hwdb1_real,2)+pow(hwdb1_imag,2));
amp2=(pow(hwdb2_real,2)+pow(hwdb2_imag,2));
hwdb[k]=10*log10(amp1/amp2);
if(hwdb[k]<-200) hwdb[k]=-200;
}
}
LMS自适应滤波:
#include <math.h>
#define pi 3.1415926
float x[500];
float y[500];
float d[500];
float e[500];
float w[50];
int L;
int N;
int i, j;
float u;
main()
{
L=500;
N=5;
u=0.00001;
for(i=0;i<500;i++)
{
x[i]=0;
d[i]=0;
e[i]=0;
y[i]=0;
}
for(i=0;i<L;i++)
{
x[i]=(float)10*sin(pi*i/20);
d[i]=x[i-2];
}
for(i=0;i<N;i++)
{
w[i]=0;
}
for(i=N;i<L;i++)
{
for(j=0;j<N;j++)
y[i]=y[i]+w[j]*x[i-j];
e[i]=d[i]-y[i];
for(j=0;j<N;j++)
w[j]=w[j]+2*u*e[i]*x[i-j];
}
}
窗函数法设计FIR滤波器:
#include "math.h"
float hd[51];
float h[51];
float w[51];
float db[300];
float pi;
float wc;
int n;
int m;
int l;
float im,re;
float a,b,p,wf,d;
int k,i;
main()
{
for(i=0;i<51;i++)
{
hd[i]=0;
h[i]=0;
w[i]=0;
}
for(i=0;i<300;i++)
{
db[i]=0;
}
m=5;
n=21;
wc=0.2;
l=300;
a=(n-1)/2;
pi=4.0*atan(1.0);
for(i=0;i<n;i++)
{
if(i==a)
hd[i]=wc;
else
{
b=i-a;
hd[i]=sin(pi*b*wc)/(pi*b);
}
}
switch(m)
{
case 1:
for(i=0;i<n;i++)
w[i]=1.0;
break;
case 2:
for(i=0;i<n;i++)
{
if(i>=a)
w[i]=2.0-2.0*i/(n-1);
else
w[i]=2.0*i/(n-1);
}
break;
case 3:
for(i=0;i<n;i++)
w[i]=0.5*(1.0-cos(2.0*pi*i/(n-1)));
break;
case 4:
for(i=0;i<n;i++)
w[i]=0.54-0.46*cos(2.0*pi*(float)i/(n-1));
break;
case 5:
for(i=0;i<n;i++)
w[i]=0.42-0.5*cos(2.0*pi*i/(n-1))+0.08*cos(4.0*pi*i/(n-1));
break;
}
for(i=0;i<n;i++)
h[i]=hd[i]*w[i];
p=pi/l;
for(k=0;k<=l-1;k++)
{
wf=(pi*k)/l;
re=0.0;
im=0.0;
for(i=0;i<n;i++)
{
re=re+h[i]*cos((float)i*wf);
im=im+h[i]*sin((float)i*wf);
}
d=sqrt(pow(re,2)+pow(im,2));
db[k]=20.0*log10(d);
}
}
|