1

我正在尝试读取 .wav 文件并将原始数据作为 FFT 算法的输入。我已使用以下代码读取 .wav 文件。

char ChunkID[4], Format[4], Subchunk1ID[4],Subchunk2ID[4];
int ChunkSize,Subchunk1Size, SampleRate, ByteRate,Subchunk2Size;
short AudioFormat, NumChannels, BlockAlign, BitsPerSample;
short *Data;

// Read the wave file
FILE *fhandle=fopen([var UTF8String],"rb");
fread(ChunkID,1,4,fhandle);
fread(&ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk1Size,4,1,fhandle);
fread(&AudioFormat,2,1,fhandle);
fread(&NumChannels,2,1,fhandle);
fread(&SampleRate,4,1,fhandle);
fread(&ByteRate,4,1,fhandle);
fread(&BlockAlign,2,1,fhandle);
fread(&BitsPerSample,2,1,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
fread(&Subchunk2Size,4,1,fhandle);
Data=(short*) malloc (sizeof(short)*Subchunk2Size/(BitsPerSample/8));  // Create an element for every sample
fread(Data,BitsPerSample/8,Subchunk2Size/(BitsPerSample/8),fhandle); // Reading raw audio data
fclose(fhandle);

ChunkID 给出值“caff”,格式给出“desc”。我在数据中看不到任何价值。我错过了什么吗?我想将原始声音数据作为 FFT 的输入。

4

3 回答 3

1

我看不到数据中的任何价值。

这具体是什么意思?你是说Data长度为零?

Data=(short*) malloc (sizeof(short)*Subchunk2Size/(BitsPerSample/8));  // Create an element for every sample

的实际值是sizeof(short)*Subchunk2Size/(BitsPerSample/8)多少?

FILE *fhandle=fopen([var UTF8String],"rb");

你确定var有正确的值吗?我假设它是一个NSString代表 .wav 声音文件路径的变量。那个文件存在吗?它有合适的长度吗?

char ChunkID[4], Format[4], Subchunk1ID[4],Subchunk2ID[4];
...
fread(ChunkID,1,4,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk2ID,1,4,fhandle);

Subchunk2ID与您以相同方式声明(然后设置)的其他三个变量相比,您的读取方式是否有差异?这对我来说似乎是一个错字。

最后,不要在 Objective-C 中以大写字母命名变量。你应该只对类名这样做。这是在 Cocoa 中编程时应该遵循的风格考虑/约定。

于 2010-10-26T08:29:39.180 回答
1

AudioToolbox.framework 中有用于读取音频文件的例程。

于 2010-10-26T08:52:50.920 回答
0

如果初始块 ID 返回 'caff' 而不是 'RIFF',那么您不是在读取 WAV 文件,因此所有其他参数(包括长度和数据)可能都是伪造的。

于 2010-10-26T20:05:50.573 回答