В настоящее время я делаю очень очень важный школьный проект. Мне нужно извлечь информацию из файла WAVE в C / C ++ и использовать эту информацию для получения LPC голосового сигнала. Но для того, чтобы сделать это, мне необходимо выполнить некоторую предварительную обработку сигнала, например, провести пересечение нуля и анализ энергии. Что означает, что мне нужен знак и реальная стоимость. Проблема в том, что я не знаю, как получить полезную информацию и правильный формат для этого. Я уже прочитал все поля в файле, но не уверен, что все делаю правильно. Предложения, пожалуйста?
Вот как я сейчас читаю файл:
readI = fread (&бит / с, 1, 2, аудио);
printf («бит на выборку =% d \ n», бит / с);
Заранее спасибо.
Моя первая рекомендация — использовать какую-то библиотеку, чтобы помочь вам. Большинство звуковых решений кажутся излишними, поэтому простая библиотека (например, рекомендованная в комментарии к вашему вопросу, libsndfile) должен сделать свое дело.
Если вы просто хотите знать, как читать файлы WAV, чтобы вы могли писать свои собственные (поскольку ваша школа может заставить вас пользоваться библиотекой, как и любой другой обычный человек), быстрый поиск в Google даст вам всю информацию, которую вы необходимость плюс некоторые люди, которые уже написали много уроков по чтению формата .wav.
Если вы все еще не получили его, вот мой собственный код, где я читаю заголовок и все другие фрагменты файла данных WAV / RIFF, пока не доберусь до фрагмента данных. Это основано исключительно от спецификации формата WAV. Извлечение фактических звуковых данных не очень сложно: вы можете либо прочитать их в необработанном виде и использовать их в необработанном виде, либо выполнить преобразование в формат, который вам будет удобнее использовать внутри системы (несжатые данные 32-битной PCM или что-то в этом роде).
Если посмотреть на приведенный ниже код, замените reader.Read...( ... )
с эквивалентным fread
вызывает целочисленные значения и размеры байтов указанного типа. WavChunks
перечисление, представляющее собой значения Little Endian идентификаторов внутри фрагмента файла WAV, и format
переменная является одним из типов типов формата Wav, которые могут содержаться в формате файла WAV:
enum class WavChunks {
RiffHeader = 0x46464952,
WavRiff = 0x54651475,
Format = 0x020746d66,
LabeledText = 0x478747C6,
Instrumentation = 0x478747C6,
Sample = 0x6C706D73,
Fact = 0x47361666,
Data = 0x61746164,
Junk = 0x4b4e554a,
};
enum class WavFormat {
PulseCodeModulation = 0x01,
IEEEFloatingPoint = 0x03,
ALaw = 0x06,
MuLaw = 0x07,
IMAADPCM = 0x11,
YamahaITUG723ADPCM = 0x16,
GSM610 = 0x31,
ITUG721ADPCM = 0x40,
MPEG = 0x50,
Extensible = 0xFFFE
};
int32 chunkid = 0;
bool datachunk = false;
while ( !datachunk ) {
chunkid = reader.ReadInt32( );
switch ( (WavChunks)chunkid ) {
case WavChunks::Format:
formatsize = reader.ReadInt32( );
format = (WavFormat)reader.ReadInt16( );
channels = (Channels)reader.ReadInt16( );
channelcount = (int)channels;
samplerate = reader.ReadInt32( );
bitspersecond = reader.ReadInt32( );
formatblockalign = reader.ReadInt16( );
bitdepth = reader.ReadInt16( );
if ( formatsize == 18 ) {
int32 extradata = reader.ReadInt16( );
reader.Seek( extradata, SeekOrigin::Current );
}
break;
case WavChunks::RiffHeader:
headerid = chunkid;
memsize = reader.ReadInt32( );
riffstyle = reader.ReadInt32( );
break;
case WavChunks::Data:
datachunk = true;
datasize = reader.ReadInt32( );
break;
default:
int32 skipsize = reader.ReadInt32( );
reader.Seek( skipsize, SeekOrigin::Current );
break;
}
}
Других решений пока нет …