Цифровая обработка сигналов
[5]
Цифровая обработка сигналов
|
Исследовательские публикации [3] |
Главная » Статьи » Цифровая обработка сигналов |
Детальное описание формата Windows PCM можно отыскать на просторах Интернета – описывать повторно в этой статье не совсем целесообразно.
Создадим рабочую программу, которая будет читать файл формата Windows PCM (моно) и содержимое файла (данные) будет отображаться на стандартном элементе управления TPaintBox.
Создадим пустой проект (приложение W32) и добавим в секции “uses” модуль “Conv” (прописав предварительно путь к ним в меню tools->Environment Options->Library…). Разместим на форме кнопку (для запуска чтения данных из файла и их отображения), и элемент типа TPaintBox – PaintBoxSgnl (для отображения данных). Общие принципы работы разрабатываемого тестового приложения: 1. Выбираем файл формата Windows PCM. 2. Создаем экземпляр класса TWavStream (описан в Conv.pas). 3. Пока есть данные в файле – читаем их и отображаем :). Выберем файл для обработки и запустим обработку (по событию – нажатие на кнопку): procedure TForm1.ButtonRunClick(Sender: TObject); begin OpenDialogFile.Filter := '*.wav'; if OpenDialogFile.Execute then begin fFileName := OpenDialogFile.FileName; end; procFile(fFileName); end; Для отображения тестового сигнала во временной области: procedure TForm1.procFile(sFileName: string); Текст процедуры: procedure TForm1.procFile(sFileName: string); var fstrm: TWavStream; dcnt: integer; //кол-во отсчетов (данных) в файле i: integer; smp: smallint; //текущий отсчет tmpX, tmpY: integer; begin // PaintBoxSngl.Canvas.MoveTo(0, PaintBoxSngl.Height div 2); // fstrm:=TWavStream.Create( sFileName, //имя файла fmOpenRead, //режим доступа 0, //формат файла – при открытии существующего файла не используется 0 //частота дискретизации – при открытии существующего файла не используется ); dcnt := fstrm.Hdr.rLen div fstrm.Hdr.fBitsPerSample; //кол-во отсчетов в файле for i:=0 to dcnt-1 do //главный цикл чтения данных begin fstrm.ReadSamples( smp, //куда читаем 1 //сколько отсчетов считываем ); tmpX := Round(i*PaintBoxSngl.Width/dcnt); tmpY := PaintBoxSngl.Height div 2 - Round(smp / 2000 {простое масштабирование}); PaintBoxSngl.Canvas.LineTo(tmpX, tmpY); //прорисовка end; fstrm.Free; end; И еще несколько замечаний: Считывание данных можно проводить блоками – так будет несколько быстрее. Для формата стерео: сначала идет отсчет с левого канала – затем с правого и т.д. Дерзайте ! Полный текст программы доступен в файловом хранилище (WAV_simple.rar). | |
Просмотров: 2833 | |
Всего комментариев: 0 | |