Цифровая обработка сигналов
[5]
Цифровая обработка сигналов
|
Исследовательские публикации [3] |
Главная » Статьи » Цифровая обработка сигналов |
В данной статье рассмотрим, как использовать Быстрое преобразование Фурье (БПФ) в своей программе. Модули с функциями, которые реализуют БПФ, доступны в каталоге файлов. Для начала работы создадим пустой проект (приложение W32) и добавим в секции “uses” модули “fftbase” и “fftfilterconst” (прописав предварительно путь к ним в меню tools->Environment Options->Library…). Разместим на форме кнопку (для выполнения генерации тестовых данных и их отображения), и два элемента TPaintBox – PaintBoxSgnl (для отображения тестового сигнала во временной области) и PaintBoxFFT (для отображения результата БПФ). Общие принципы работы разрабатываемого тестового приложения: 1. Сгенерируем тестовый сигнал (синус). 2. Заполним полученными значениями буфер (размером 128 значений). 3. Выполним отображение сигнала в элементе PaintBoxSgnl. 4. Выполним преобразование тестового сигнала (БПФ). 5. Выполним отображение результата БПФ в элементе PaintBoxFFT. Для начала работы объявим несколько переменных: Глобальные: fDataBuf: array [0..127] of SmallInt; //Буфер для хранения тестового сигнала Сгенерируем тестовый сигнал (синус) и отобразим результаты на экране (по событию – нажатие на кнопку): for i:=0 to 128-1 do //генерация тестового сигнала begin fDataBuf[i] := 10000*sin(2*Pi*2000*i/180); end; DrawSgnl(); MakeFFT(); DrawFFT(); Для отображения тестового сигнала во временной области: procedure DrawSgnl(); //Тестовый сигнал - временное представление Текст процедуры: procedure TForm1.DrawSgnl; var i, tmpX, tmpY: integer; begin PaintBoxSgnl.Canvas.MoveTo(0, PaintBoxSgnl.Height div 2); for i:=0 to 128-1 do begin tmpX := Round(i*PaintBoxSgnl.Width/128); tmpY := PaintBoxSgnl.Height div 2 - Round(fDataBuf[i]*PaintBoxSgnl.Height/2/32767); PaintBoxSgnl.Canvas.LineTo(tmpX, tmpY); end; end; Непосредственно БПФ и отображение результата: procedure MakeFFT(); //БПФ Текст процедуры: procedure TForm1.MakeFFT; var fftb: TFFTBase; //класс, который реализует БПФ fFFTComplBuf: ^TComplexArray; //Буфер для хранения комплексных величин i: integer; begin GetMem(fFFTComplBuf, 128*SizeOf(TComplex)); //Выделение памяти под массив for i:=0 to 128-1 do //Заполняем данными массив begin fFFTComplBuf[i].Re := fDataBuf[i]; fFFTComplBuf[i].Im := 0; end; fftb:=TFFTBase.Create(nil); // //FFT - выполнение БПФ //Параметры: //указатель на массив данных (с комплексными числами) //N - количество данных (размерность массива) //2^X=N (степень числа два) //False – прямое преобразование; True – обратное //Тип окна: // 0-прямоугольное // 1-треугольное // 2-Хэминга // 3-Ханна // 4-Блэкмана // fftb.FFT(Pointer(fFFTComplBuf), 128, 7, False, 0); for i:=0 to 128-1 do //Переносим результат БПФ в исходный массив begin //заполняем массив выходными значениями (предварительно масштабируем их) fDataBuf[i] := Round(fFFTComplBuf[i].Re / 500); end; fftb.Free; FreeMem(fFFTComplBuf, 128*SizeOf(TComplex)); //Освобождение памяти выделенной под массив end; Отображение результата БПФ: procedure DrawFFT(); //Отображение результата БПФ Текст процедуры: procedure TForm1.DrawFFT; var i, tmpX, tmpY: integer; begin PaintBoxSgnl.Canvas.MoveTo(0, PaintBoxFFT.Height); for i:=0 to 128-1 do begin tmpX := Round(i*PaintBoxFFT.Width/128); tmpY := PaintBoxFFT.Height - Round(fDataBuf[i]); PaintBoxFFT.Canvas.LineTo(tmpX, tmpY); end; end; Вот собственно и все… Не так уж и сложно. И еще несколько замечаний: Результат применения различных типов окон при БПФ можно посмотреть, подставив в последний параметр функции FFT значения от 0 до 4 (см. комментарии). Результат работы БПФ все-таки комплексный, поэтому в результат вычисляется (в самом модуле) следующим образом: V=SQRT(Re^2+Im^2) Если количество данных меньше, чем размер буфера – остаток следует заполнить нулями. Для вычисления БПФ некоторого набора данных данные последовательно записываются в буфер (буфер построенный по принципу FIFO), после каждого добавления нового значения вычисляется БПФ и отображается результат, после чего значения в буфере сдвигаются на одну позицию. И так пока данные не закончатся J. Полный текст программы доступен в файловом хранилище (FFT_simple.rar). | |
Просмотров: 15028 | Комментарии: 20 | |
Всего комментариев: 20 | |||||||||||||||||||
| |||||||||||||||||||