данные равны нулю при чтении из .Файл wav в iphone?

#iphone #c #signal-processing #fread #wav

#iPhone #c #обработка сигналов #черт #wav

Вопрос:

Я пытаюсь прочитать .файл 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(amp;ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(amp;Subchunk1Size,4,1,fhandle);
fread(amp;AudioFormat,2,1,fhandle);
fread(amp;NumChannels,2,1,fhandle);
fread(amp;SampleRate,4,1,fhandle);
fread(amp;ByteRate,4,1,fhandle);
fread(amp;BlockAlign,2,1,fhandle);
fread(amp;BitsPerSample,2,1,fhandle);
fread(amp;Subchunk2ID,1,4,fhandle);
fread(amp;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.

Ответ №1:

В AudioToolbox.framework есть подпрограммы для чтения аудиофайлов.

Ответ №2:

я не вижу никакого значения в данных.

Что конкретно это означает? Вы хотите сказать, что 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 переменная, которая представляет путь к a .Звуковой файл 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(amp;Subchunk2ID,1,4,fhandle);
  

Есть ли причина, по которой вы читаете в Subchunk2ID иначе, чем три другие переменные, которые вы объявили (а затем установили) таким же образом? Для меня это выглядит как опечатка.

Наконец, не называйте свои переменные в Objective-C заглавными буквами. Вы должны делать это только для имен классов. Это соображение стиля / соглашение, которому вы должны следовать при программировании в Cocoa.

Комментарии:

1. В отладчике, если я проверяю значение, присвоенное «данным», оно выдает 0

2. Краткий совет для iPhone, который может быть не связан: используйте [[NSBundle mainBundle] pathForResource:@»nameOfWav», тип:@»wav»], чтобы получить полный путь к файлу wav, включенному в пакет вашего приложения. Затем вызовите UTF8String для этого, чтобы получить что-то, что вы можете передать в fopen.

Ответ №3:

Если начальный идентификатор фрагмента возвращает ‘caff’, а не ‘RIFF’, то вы не читаете файл WAV, поэтому все остальные параметры, включая длину и данные, вероятно, поддельные.