Приветствую Вас Гость!
Четверг, 28.03.2024, 15:55
Главная | Регистрация | Вход | RSS

Advert

Категории раздела

Наш опрос

Оцените мой сайт
Всего ответов: 32

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Реклама

Вход на сайт

Меню сайта

Поиск

Друзья сайта

DSA.Statistics

Каталог статей

Главная » Статьи » Цифровая обработка сигналов

Работа с файлами формата Windows PCM – простой пример на Delphi
Детальное описание формата 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).

 

Категория: Цифровая обработка сигналов | Добавил: Dsa (20.07.2007) | Автор: R.Sem E W
Просмотров: 2799 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
puEnt2