?? pcm22212.c
字號(hào):
#include <alawmain.h>
int main(void)
{
short aa[10];
short *temp3;
int k;
for(k=0;k<10;k++)
scanf("%d",aa+k);
temp3=alawmain(aa);
}
short * alawmain(short a[])
{
int i,j;
float n=256;
float d;
double A=87.56;
int num=2400;
//short a[10];//absf[10]
double f[2400],absf[2400];
//double fquan[10];
int bquan[2400];
float q[256];
int nu=log(n)/log(2); //碼字長(zhǎng)度=log2(n)
int code[2400][8]={0}; //10=4800,nu=log2(n)
double *temp2,*temp1;
double aquan[2400]; //恢復(fù)后的采樣點(diǎn) //
double temp[2400];
printf("input a:");
for(i=0;i<10;i++)
scanf("%d",a+i);//輸入采樣點(diǎn)
temp2=alaw(a);
for(i=0;i<2400;i++)
temp[i]=temp2[i];
for(i=0;i<2400;i++)
printf("alaw:%f\n",temp[i]);
for(i=0;i<2400;i++)
{
f[i]=temp[i]; //經(jīng)過(guò)A律壓縮的采樣點(diǎn)
absf[i]=absfunc(f[i]); //define absf[10] ,call absfunc()
}
d=2/n; //量化間隔
for(i=0;i<n;i++)
{
q[i]=d*i;
q[i]=q[i]-((n-1)/2)*d; //量化電平,將0~2影射到-1~1
}
for(i=0;i<2400;i++)
if(f[i]!=1)
{
for(j=0;j<n;j++)
{
if((q[j]-d/2<=f[i])&&(f[i]<q[j]+d/2))
f[i]=q[j]; //賦值為相應(yīng)的量化電平
if(f[i]==q[j])
bquan[i]=j;//對(duì)量化電平進(jìn)行編號(hào)
}
}
else
{
f[i]=q[(int)n-1];
bquan[i]=(int)n-1;
}
for(i=0;i<2400;i++)
{
if(bquan[i]<(int)n/2)
bquan[i]=(int)n/2-bquan[i]-1; //對(duì)折疊碼進(jìn)行處理
for(j=nu;j>0;j--)
if(floor(bquan[i]/pow(2,(j-1)))==1)
{
code[i][nu-j]=1; //編碼矩陣
bquan[i]=bquan[i]-pow(2,(j-1)); //從高向低編碼
}
}
//return *bquan; //?????
for(i=0;i<2400;i++)
{
for(j=0;j<nu;j++)
printf("%d",code[i][j]);
printf("\n");
}
//for(i=0;i<10;i++)
//for(j=0;i<nu;j++)
//{
// if(code[i][j]==1)
// fquan[i]=pow(2,nu-j)+fquan[i];
//}
for(i=0;i<2400;i++) //譯碼
{
temp1=invalaw(f); //對(duì)量化完畢的信號(hào)進(jìn)行A律的擴(kuò)張//
aquan[i]=temp1[i]*2048; //由于擴(kuò)張后得到的結(jié)果是對(duì)原信號(hào)的歸一化,因此需要進(jìn)行恢復(fù)
}
for(i=0;i<2400;i++)
{
aquan[i]=(short)aquan[i];
printf("%f\n",aquan[i]);
}
return aquan;
}
//A律擴(kuò)張
double * invalaw(double y[]) //
//INVALAW A律非線性的逆
//X=INVALAW(Y,A)Y=A律非線性的歸一化輸出
{ //
int i;
double x[2400];//
for(i=0;i<2400;i++) //
if(absfunc((double)y[i])<=1/(1+log(87.56)))
x[i]=((double)y[i])*(1+log(87.56))/87.56;
else //
x[i]=signfunc1(y[i])*((exp((absfunc(y[i]))*(1+log(87.56))-1))/87.56);
return x;
}
double * alaw(short x[])
{
double absx[2400];
int i;
double y[2400];
for(i=0;i<2400;i++)
{
absx[i]=absfunc(x[i]); //define absx[10] ,call absfunc()
}
for(i=0;i<2400;i++)
{
if(absfunc((double)x[i]/2048)<=1/87.56)
y[i]=87.56*(absx[i]/2048)/(1+log(87.56));
else
y[i]=signfunc(x[i])*((1+log(87.56*((double)absx[i]/2048)))/(1+log(87.56)));
}
return y; //return y[i]; ?
}
double max(double * x)
{
double temp=x[0];
int i;
for(i=0;i<=2400;i++) //
temp=(x[i]>=temp? x[i]:temp);
return temp;
}
double absfunc(double data) //abs函數(shù)返回的是int類型的數(shù)據(jù),自己寫的返回doule的函數(shù)
{
double x;
if(data<0)
x=-data;
else x=data;
return x;
}
int signfunc(int y) // sign函數(shù)
{
int ydata;
if(y<0)
ydata=-1;
else ydata=1;
return ydata;
}
int signfunc1(double y)
{
int ydata;
if(y<0)
ydata=-1;
else ydata=1;
return ydata;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -