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;
}