Предмет: Программирование. Добавлен: 05.12.2017. Год: 2015. Страниц: 22. Оригинальность по antiplagiat.ru: < 30% |
Введение……….3 1. Описание структуры WAV файла………...………3 2. Математическое представление задачи………..………5 3. Описание используемых алгоритмов………7 4. Блок – схемы используемых алгоритмов………9 5. Результат работы программы………15 Заключение………..17 Список литературы……….17 Приложение А……….18 Работа с wav файлами - это непременный атрибут современной информационной жизни. Работа с WAV файлами связана с программами для воспроизведения звука, таких как Windows Media Player и других программ, доступных для вашей операционной системы. Эти файлы содержат любые звуки, такие как звуковые эффекты, музыка или произнесенные слова. Они были созданы и разработаны компанией IBM и Microsoft, но в отличие от MP3-и MP4, формат WAV не использует сжатие с потерями. Целью курсовой работы является ознакомление с типизированными файлами на примере формата wav и отработка навыка работы со структурами, методами обработки данных файла, считывание заголовка и данных исходного wav файла, определение параметров звукового файла и вывод их на экран. Также необходимо написать программу на языке С/C++, осуществляющую следующие действия: - реализация функции, объединяющей два wav файла в один, путем добавления отсчетов второго в конец первого, параметры BitRate, SamplesPerSec соответствуют первому файлу; поля nChannels и blockAlign для входных файлов должны быть одинаковы; - реализация метода генерации шума и треугольного сигнала по входным параметрам: протяженность сигнала в секундах, частота дискретизации, амплитуда сигнала в процентах от максимального уровня; - реализация метода увеличения частоты дискретизации звукового сигнала с использованием интерполяции; - реализация квантования входной последовательности по уровню сигнала. 1. Описание структуры WAV файла Для большинства wav файлов может быть использована следующая структура заголовка: struct WAVEHEADER { char chunkId[4]; unsignedlong chunkSize; char format[4]; char subchunk1Id[4]; unsignedlong subchunk1Size; unsignedshort wFormatTag; unsignedshort nChannels; unsignedlong SamplesPerSec; unsignedlong AvgBytesPerSec; unsignedshort blockAlign; unsignedshort BitsPerSample; charsubchunk2Id[4]; unsignedlong subchunk2Size; }; Поле chunkId[4] содержит информацию о формате файла для wav файла это RIFF (RIFF – Resource Interchange File Format, то есть контейнер для потоковых данных). По типу формата файла определяется смещение остальных полей и самих данных. Поле chunkSize содержит размер в байтах оставшейся части файла, то есть, за исключением полей chunkId[4] и chunkSize. Таким образом, общий размер файла равен chunkSize+8. Поле format[4] указывает на конкретный формат потоковых данных, так как формат RIFF может быть использован для хранения данных avi или rmi. Для wav файла значение этого поля равно “WAVE”. Поле subchunk1Id[4] представляет собой заголовок fmt-чанка, то есть той части заголовка, где описываются параметры wav файла. В поле subchunk1Size содержится размер подструктуры subchunk1, то есть 16 байт для формата PCM (Pulse Code Modulation). Поле wFormatTag определяет аудиоформат: значение 0 используется для неизвестного формата, значение 1 для формата PCM. На данный момент количество существующих форматов превышает 200. Поле nChannels определяет количество каналов. Чаще всего это Mono(1)или Stereo(2). Поле SamplesPerSec определяет частоту дискретизации в Гц, например 16000 Гц. Сэмпл – это блок звуковых данных, включающий оба канала. Поле AvgBytesPerSec или ByteRate определяет количество передаваемых байт в секунду воспроизведения. Поле blockAlign содержит размер сэмпла в байтах. Может принимать значения 1, 2, 4 и т.д. Поле BitsPerSample содержит размер сэмпла в битах. Поле subchunk2Id[4] обозначает начало чанка данных, то есть непосредственно отсчетов звукового сигнала. Содержит символы “data”. Поле subchunk2Size содержит размер области данных в байтах. Количество сэмплов в файле можно определить следующим образом subchunk2Size*8/Bits erSample. Использование данной структуры корректно для формата PCM, но для других форматов может привести к ошибкам, так как структура подзаголовков может отличаться. После заголовка WAVEHEADER следуют непосредственно чередующиеся отсчеты звукового сигнала: Sample[0],Sample[1], ample[2],Sample[3] и т. д. Для Mono звука Sample[0] содержит Сhannel0[0], так как в данном случае в сэмпле содержится один канал. Для Stereo звука Sample[0] содержит СhannelLeft[0] и СhannelRight[0], так как в данном случае в сэмпле содержится два канала. 2. Математическое представление задачи Для реализации функции, объединяющую два wav файла в один, путем добавления отсчетов второго в конец первого, сначала необходимо пересчитать размер данных для нового файла. Вычисление размера области данных нового файла (header_head.subchun 2Size) выполняется по формуле (2.1), где header.subchunk2Size – размер области данных дописываемого файла. Вычисление общего размера текущего файла (header_head.chunkSi e) выполняется по формуле (2.2). header_head.subchunk Size += header.subchunk2Size (2.1) header_head.chunkSiz = sizeof(header_head.c unkSize) + header_head.subchunk Size (2.2) Для реализации треугольного сигнала, необходимо учитывать то, что треугольный сигнал может быть задан по формуле (2.3), где l – 2 в степени BitsPerSample (максимальное значение сэмпла). Data[i]=(i%(-l) * Amplitude)-Amplitude 2 (2.3) Сигнал шума формируется согласно формуле (2.4). data[i]=(2*((rand()/( double)RAND_MAX))-0.5 )*Period* mplitude*l (2.4) При интерполяции происходит перерасчёт размера текущего файла (header_head.chunkSi e) по формуле (2.5) и размера области данных файла (header_head.subchun 2Size) по формуле (2.6). header2.chunkSize+=h ader2.subchunk2Size (2.5) header2.subchunk2Siz *=2 (2.6) Для выполнения квантования необходимо сначала пересчитать количество передаваемых байт в секунду воспроизведения по формуле (2.7), где SamplesPerSec определяет частоту дискретизации в Гц, а BitsPerSample содержит размер сэмпла в битах. header6.AvgBytesPerS c=header6.SamplesPer ec* (header6.BitsPerSamp e/8) (2.7) Для нахождения коэффициента перевода применятся формула (2.8), где y – максимальное значение исходного сэмпла, а header6.BitsPerSampl – текущее. Koef=pow(2.0, y)/ pow(2.0, header6.BitsPerSampl ) (2.8) ... 1. Фролов И. Г. Мультимедиа для Windows. СПб: Наука, 2011. 192 с. 2. Мешков В.П. Работа с аудио/видео файлами. М.: Сокол, 2012. 354 с. 3. ИНТУИТ: Работа с медиафайлами, URL studies/courses/10468 1075/lecture/16552?pa e=4 4. Формат WAV-файлов, URL oldgr/courses/cg02b/a signs/hw-2/help/wavfm 2.htm |
Перейти к полному тексту работы |