C语言的谱减法实现(国外英文资料)
C语言的谱减法实现(国外英文资料)
# include < stdio . h >
# include < stdlib.h >
# include < math.h >
#定义WL 256 / /窗长
#定义P 10 / /预测系数
# undefπ
#定义3.1415926535897932384626434π
#定义3.1415926π
#定义winsize 256
#定义tempsize winsize / 2
#定义buffsize winsize * 10
typedef struct {
双的;
双编码器;
}复杂;
unsigned int f = 0;
无符号整型c = 0;
复杂的噪声(winsize);
双buff_r[buffsize];
双buff_w[buffsize];
双温度(tempsize);
复杂的x(winsize);
复杂的y(winsize);
int hr = 0;
复杂的W(winsize);
复杂的W1[winsize];
双x_abs[winsize];
双y_abs[winsize];
双noise_abs[winsize];
空白fft(复杂* x,int size_x复杂* W);/ *快速傅里叶变换* /
void ifft(复合* x,int size_x,complex * W1);
二倍角(复杂);/ /
空白添加(复杂的,复杂的,复杂的*);/ *复数加法* /
空白mul(复杂的,复杂的,复杂的*);/ *复数乘法* /
无效子(复杂的,复杂的,复杂的*);/ *复数减法* /
空变化(复杂* x,int size_x);/ *数组转置* /
双abs1(复杂的);
无效的汉明(复杂hw[]);
/ * int型read波形文件(char * fn,int * fs,short * * dat);
int ReadWaveFile(
/ /我char * fn:文件名
int * fs,/ / O:文件大小
短* * dat / / O:语音数据
)
{
文件*《外交政策》;
int dsize;
如果(fp = fn," rb + ")= = NULL){
fprintf(stderr," % s:No such file \ n ",fn);返回(- 1);
}
fseek(fp,0 l,SEEK_END);
dsize = ftell(fp)/ 2;
fseek(fp,0 l,SEEK_SET);
if(* dat =(short *)malloc(sizeof(short)* dsize)= = NULL)
fprintf(stderr,“内存错误\ n”);返回(- 1);
}
if(* dat,sizeof(short),dsize,fp)!=(unsigned int)dsize){
自由(* dat);
返回(1);
}
文件关闭(fp);
* fs = dsize;
返回(0);
} * /
无效的汉明(复杂hw[])
{
双x;
int我;
(我= 0;
{
双cos(x);
x = 2π* *我/(WL-1);
hw[我].real = hw[我].real *(0.54 - -0.46 * cos(x));/ / * 32768;
}
}
void fft(复合* x,int size_x,complex * W){
int i = 0 j = 0 k = 0,l = 0,jk = 0;
复杂的上,下,产品;
改变(x,size_x);
(我= 0;
l = 1 <
(j = 0;< size_x;j + = 2 * l){ / *一组蝶形运算* /
(k = 0;k < l;k + +){ / *一个蝶形运算* /
jk = j + k;
mul(x(jk + l),W(size_x * k / 2 / l),产品);
up.real = x(jk).real + product.real;
up.img = x(jk)。img + product.img;
down.real = x[jk].real-product.real;
下来。img = x[jk].img-product.img;
x(jk)=;
x(jk + l)=;
}
}
}
}
/ *变址计算,将x(n)码位倒置* /
空变化(复杂* x,int size_x){
复杂的温度;
无符号短我= 0,j = 0,k = 0;
双t;
(我= 0;< size_x;+ +){
k = i,j = 0;
t =(日志(size_x)/日志(2));
在((t -)> 0){