C语言的谱减法实现七_第1页
C语言的谱减法实现七_第2页
C语言的谱减法实现七_第3页
C语言的谱减法实现七_第4页
C语言的谱减法实现七_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言的谱减法实现七 C语言的谱减法实现.txt18拥有诚实就舍弃了虚伪;拥有诚实就舍弃了无聊;拥有踏实就舍弃了浮躁不论是有意的丢弃还是意外的失去只要曾经真实拥有在一些时候大度舍弃也是一种境界。C语言的谱减法实现.txt12思念是一首诗让你在普通的日子里读出韵律来;思念是一阵雨让你在枯燥的日子里湿润起来;思念是一片阳光让你的阴郁的日子里明朗起来。#include <stdio.h> #include <stdlib.h> #include <math.h> #define WL 256 / 窗长#define

2、10 / 预测系数#undef i #define i 3.1415926535897932384626434 #define I 3.1415926#define winsize 256#define temsize winsize/2#define buffsize winsize*10tyedef structdouble real;double img;comlex;unsigned int f=0;unsigned int c=0;comlex noisewinsize;double buff_rbuffsize;double buff_wbuffsize;double temtem

3、size;comlex xwinsize;comlex ywinsize;int hr=0;comlex Wwinsize;comlex W1winsize;double x_abswinsize;double y_abswinsize;double noise_abswinsize;void fft(comlex *x,int size_x,comlex *W); /*快速傅里叶变换*/void ifft(comlex *x,int size_x,comlex *W1);double angle(comlex a); /void add(comlex ,comlex ,comlex *);

4、/*复数加法*/void mul(comlex ,comlex ,comlex *); /*复数乘法*/void sub(comlex ,comlex ,comlex *); /*复数减法*/void change(comlex *x,int size_x); /*数组转置*/double abs1(comlex a);void hamming(comlex hw);/*int ReadWaveFile( char*fn,int*fs,short *dat); int ReadWaveFile( char*fn,/ I: 文件名 int*fs,/ O: 文件大小 short*dat/ O: 语

5、音数据 ) FILE*f; intdsize; if (f = foen(fn, "rb+") = NULL) frintf(stderr, "%s: No such file n", fn);return(-1); fseek(f, 0L, SEEK_END); dsize = ftell(f)/2; fseek(f, 0L, SEEK_SET); if (*dat = (short *)malloc(sizeof(short)*dsize) = NULL) frintf(stderr, "Memory

6、 Error n");return(-1); if (fread(*dat, sizeof(short), dsize, f) != (unsigned int)dsize) free(*dat); return(-1); fclose(f); *fs = dsize; return(0); */void hamming(comlex hw)double x;int i;for(i=0;i<WL;i+)double cos(x);x=2*i*i/(WL-1);hwi.real=hwi.real*(0.54-0.46*cos(x);/*32768; void ff

7、t(comlex *x,int size_x,comlex *W)int i=0,j=0,k=0,l=0,jk=0;comlex u,down,roduct;change(x,size_x);for(i=0;i<log(size_x)/log(2);i+) /*一级蝶形运算*/l=1<<i;for(j=0;j<size_x;j+= 2*l ) /*一组蝶形运算*/for(k=0;k<l;k+) /*一个蝶形运算*/jk=j+k;mul(xjk+l,Wsize_x*k/2/l,&am;roduct);u.real=xj

8、k.real+roduct.real;u.img=xjk.img+roduct.img;d own.real=xjk.real-roduct.real;down.img=xjk.img-roduct.img;xjk=u;xjk+l=down;/*变址计算将x(n)码位倒置*/void change(comlex *x,int size_x)comlex tem;unsigned short i=0,j=0,k=0;double t;for(i=0;i<size_x;i+)k=i;j=0;t=(log(size_x)/log(2);while( (t-)>0 )j=j

9、<<1;j|=(k &am; 1);k=k>>1;if(j>i)tem=xi;xi=xj;xj=tem;void ifft(comlex *x,int size_x,comlex *W1)int i=0,j=0,k=0,l=0,jk=0;comlex u,down,roduct;change(x,size_x);for(i=0;i< log(size_x)/log(2) ;i+) /*一级蝶形运算*/l=1<<i;for(j=0;j<size_x;j+= 2*l

10、 ) /*一组蝶形运算*/ for(k=0;k<l;k+) /*一个蝶形运算*/jk=j+k;mul(xjk+l,W1size_x*k/2/l,&am;roduct);u.real=xjk.real+roduct.real;u.img=xjk.img+roduct.img;down.real=xjk.real-roduct.real;down.img=xjk.img-roduct.img;xjk=u;xjk+l=down;for(i=0;i<size_x;i+)xi.img=xi.img/size_x;xi.real=xi.real/size_x;doubl

11、e angle(comlex a)double m;m=tan(a.img/(a.real+0.00001);return m;void add(comlex a,comlex b,comlex *c)c->real=a.real+b.real;c->img=a.img+b.img;void mul(comlex a,comlex b,comlex *c)c->real=a.real*b.real - a.img*b.img;c->img=a.real*b.img + a.img*b.real;void sub(comlex a,coml

12、ex b,comlex *c)c->real=a.real-b.real;c->img=a.img-b.img;double abs1(comlex a)double t;t = (a.real)*(a.real)+(a.img)*(a.img);return (double) sqrt(t);/*主程序*/void main(void) double wavin7680, wavout7680;comlex S60256,voice256;comlex noise1256;double noise_foward15frame15256;double am_nois

13、e256;int fs=8000;double sum15256,voice_timedomain60256;double hase256;double am_signal256;double am_voice256;int frame_len=256,ste_len=128,n_frame=15,wav_length=7680,i,j,size_x=256,nifrm,ifrm;int kk=0,n=1;for(i=0;i<wav_length;i+)wavini=i;switch (fs) case 8000:frame_len=256;ste_len=128;break;c

14、ase 10000:frame_len=400;ste_len=200;break;case 12000:frame_len=480;ste_len=240;break;case 16000:frame_len=640;ste_len=320;break;case 44100:frame_len=1800;ste_len=900;break;default:frame_len=1800;ste_len=900;break;n_frame=(wav_length-frame_len)/ste_len+1; for(i=0;i<n_frame;i+) /分帧 int n1,n2; n

15、1=i*ste_len;n2=i*ste_len+frame_len;for(j=n1;j<=n2;j+)Sij-n1.real=wavinj;Sij-n1.img=0.0;for(i=0 ;i<winsize;i+) /初始化W数组Wi.real=cos(2*I/size_x*i);Wi.img=-1*sin(2*I/size_x*i); for(i=0;i<winsize;i+) /初始化W数组W1i.real=cos(2*I/size_x*i);W1i.img=sin(2*I/size_x*i); for(nifrm=0;nifrm&lt

16、;15;nifrm+)hamming(Snifrm);for(i=0;i<frame_len;i+) noise1i.real=Snifrmi.real;noise1i.img=0.0;fft(noise1,256,W); for( i=0;i<frame_len;i+)noise_foward15framenifrmi=abs1(noise1i); /noise_foward15frame保存前15帧的噪音短时傅立叶变换幅度结果 for(j=0;j<frame_len;j+)double w=0.0;for(i=0;i<15;i+)w=

17、w+noise_foward15frameij;am_noisej=w/15; for(ifrm=0;ifrm<n_frame;ifrm+) hamming(Sifrm);for( i=0;i<frame_len;i+)sumifrmi=Sifrmi.real; /sum_timedomain保存整个语音信号的时域和的结果fft(Sifrm,256,W); /快速傅里叶变换参数for(i=0;i<frame_len;i+)hasei=angle(Sifrmi); ; /保存这帧语音信号的傅立叶变换的结果的相位for(i=0;i<frame

18、_len;i+)am_signali=abs1(Sifrmi); / 保存这帧语音信号的傅立叶变换的结果的幅度 for( i=0;i<frame_len;i+)am_voicei=am_signali;/-am_noisei; /谱减 %用信号的幅度减去噪声的幅度得到纯净语音的幅度for (i=0;i<frame_len;i+)if(am_voicei<0)am_voicei=0.0;for(i=0;i<frame_len;i+)voicei.real=am_voicei; /组合相位与幅度得到去噪后的纯净语音信号voicei.img=hasei*voicei.real;ifft(voice,frame_len,W1);for(i=0;i<frame_len;i+)voice_timedomainifrmi=voicei.real; / 求这帧纯净语音信号的傅立叶反变换的实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论