pcm2wav matlab,语音处理-——WAV文件读取-Matlab代码以及C语言代码

1.这里用matlab编程读取wav文件的数据信息,读出来的数据将存放在

oyr.txt中,此数据不包含wav信息的头文件数据。(在运行之前,请按照自己的音频文件更改路径)

clear;close all;clc;

[x,fs,Nbit]=wavread('E:\Matlab_Code\oyr.wav'); sound(x,fs,Nbit);

X=fft(x);

magX=abs(X);

angX=angle(X);

subplot(2,2,1);plot(x);title('原始信号波形');

subplot(2,2,2);plot(X);title('原始信号频谱');

subplot(2,2,3);plot(magX);title('原始信号幅值');

subplot(2,2,4);plot(angX);title('原始信号相位');

fp=fopen('E:\Matlab_Code\oyr.txt','wt');

fprintf(fp,'采样频率:fs = %d\t',fs);

fprintf(fp,' 大小: size(x) =');

fprintf(fp,'%d\t',size(x));

fprintf(fp,'\n\n 数据区的数据:\n'); %此数据不包括头文件数据

fprintf(fp,'%5.2f\t',x);

fclose(fp);

2.下面是用C语言编写的提取WAV头文件的信息的代码:

C语言提取的时候包含了wav头文件信息按照如下的头文件编程的。

友情提示:用文件编辑器UltraEdit软件也可以打开WAV文件,且将以十六进制数据的形式显示。

表1 WAV文件的文件头

地址

类型

内容

00H~03H

4

资源交换文件标志(RIFF)

04H~07H

4

长整数

从下个地址开始到文件尾的总字节数

08H~0BH

4

WAV文件标志(WAVE)

0CH~0FH

4

波形,格式标志(fmt)

10H~13H

4

过滤字节(一般为00000010H)

14H~15H

2

格式种类(值为1时,表示数据为线性PCM编码)

16H~17H

2

通道数,单声道为1,双声道,为2

18H~1BH

4

长整数

1CH~1FH

4

长整数

波形数据传输速率(每秒平均字节数)

20H~21H

2

数据的调整数(按字节计算)

22H~23H

2

24H~28H

4

“fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。

29H~33H

4

长整数

size,数值为4

34H~38H

4

长整数

表2 WAV声音文件的数据块

偏移地址

字节数

类型

内容

24H~27H

4

数据标志符(data)

28H~2BH

4

采样数据总数

#include

#include

int main()

{

int i;

char head[50]; //用于存放文件的头信息:

文件头的长度为44字节

FILE *fp;

fp=fopen("oyr.wav","r"); //读取名为:oyr.wav的文件

if(fp==NULL)

{

printf("打开文件失败!!\n");

exit(0);

}

//1.(按照UltraEdit软件打开WAV文件的格式显示):16个数据一行,且用十六进制表示数据

printf("1.此WAV文件的头信息如下所示:\n");

for(i=0;i<44;i++)

{

head[i]=fgetc(fp);

if(i==0)

printf("\n");

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//2.资源交换文件标志(RIFF)

printf("\n\n2.资源交换文件标志(RIFF):");

for(i=0;i<=3;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//3.size大小:

printf("\n\n3.size大小:");

for(i=4;i<=7;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//4.wav文件标志:

printf("\n\n4.wav文件标志:");

for(i=8;i<=11;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//5.波形格式标志fmt:

printf("\n\n5.波形格式标志fmt:");

for(i=12;i<=15;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//6.过滤字节

printf("\n\n6.过滤字节:");

for(i=16;i<=19;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//7.格式种类:

printf("\n\n7.格式种类:");

for(i=20;i<=21;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

if(head[i]==1)

printf("

数据为线性PCM编码");

}

//8.声道数:

printf("\n\n8.声道数:");

for(i=22;i<=23;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

if(head[i]==1)

printf("

单声道");

if(head[i]==2)

printf("

双声道");

}

//9.采样频率fs:

printf("\n\n9.采样频率fs:");

for(i=24;i<=27;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//10.波形数据传输速率(每秒平均字节数):

printf("\n\n10.波形数据传输速率(每秒平均字节数):");

for(i=28;i<=31;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//11.数据的调整数(按字节计算):

printf("\n\n11.数据的调整数(按字节计算):");

for(i=32;i<=33;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//12.样本数据位数:

printf("\n\n12.样本数据位数:");

for(i=34;i<=35;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//13.数据标示符(data):

printf("\n\n13.数据标示符(data):");

for(i=36;i<=39;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

//14.采样数据总数:

printf("\n\n14.采样数据总数:");

for(i=40;i<=43;i++)

{

if(head[i]>=16)

printf("%X

",head[i]);

else

printf("0%X

",head[i]);

}

printf("\n\n 剩下的数据为采样数据,在此将不显示!!!\n\n");

fclose(fp);

return 0;

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值