问题描述

毕业设计中,需要用软件WXtoimg记录的NOAA发出的APT信号(wav格式),然后用MATLAB读取该wav文件,从而解调出所需要的卫星图,但是在用MATLAB读取该文件时却出现了以下错误:

1
2
Error using ==> wavread
Incorrect chunk size information in WAV file.

即文件大小信息不正确。

问题分析

根据错误信息可知:我们尝试读取的wav文件的结构不正确。
在wav文件的文件头信息里,有两个数值与wav文件的大小有关,如果这两个数值与文件的实际大小不相符的话,这个文件就会被认为是无效的文件。从网上找到wav文件的文件头各个字节所代表的意义,如下表:

wavhead

由表格可以看出:

  1. 在文件头的04H~07H地址的数值代表:从下个地址开始到文件尾的总字节数,数值:filesize - 8
  2. 在文件头的28H~2BH地址的数值代表:从下个地址开始到文件尾的总字节数,数值:filesize - 44

解决办法

我们已经知道了错误原因和wav文件正确的文件头,现在我们可以修改文件头信息里与文件大小相关的两个数值,使其与文件实际大小相符,即可改正wav文件。
新建matlab函数:wavchunksizefix.m
以下为修正wav文件的matlab函数:

1
2
3
4
5
6
7
8
9
function wavchunksizefix( filename )
d = dir(filename); %取得wav文件信息
fileSize = d.bytes; %从文件信息里提取出wav文件的实际大小
fid=fopen(filename,'r+','l'); %以读写模式打开wav文件
fseek(fid,4,-1); %fseek函数调整位置指针使其指向第一个与文件大小相关的数字
fwrite(fid,fileSize-8,'uint32'); %将该数字修改成正确的大小,即:fileSize-8
fseek(fid,40,-1); %fseek函数调整位置指针使其指向第二个与文件大小相关的数字
fwrite(fid,fileSize-44,'uint32'); %将该数字修改成正确的大小,即:fileSize-44
fclose(fid); %关闭文件

将这个wavchunksizefix.m文件放进matlab的执行目录里,然后在命令行里运行如下命令:

1
wavchunksizefix( filename )

现在wav文件即得到修正,经测试,重新用wavread函数读取该文件不会再报错。

注意

该matlab函数会直接修改wav文件,建议修改wav文件之前先备份wav文件。