Класс Dmatrix - операции с матрицами на C++

 

Динамическая модель вибрации двигателя

 

Теория и практика программирования БПФ от М.В.

 


 

Класс FFT

 

Калюжный О.Н.

oleg314@mail.ru

 

 

Исходники класса   (обновлено 07.08.2017, см. примечание внизу!)

 

Класс FFT предназначен для встраивания в исходный код задач, реализованных на языке C++, в которых необходимо проводить расчет спектра (АЧХ) сигнала по методу БПФ (быстрого преобразования Фурье).

Класс содержит следующие основные переменные и функции, используемые программистом при встраивании кода:

 

Переменные на входе БПФ:

N – количество точек спектра

T степень числа 2, определяющая количество точек спектра N  (то есть N = 2 ^ T)

Xre[T][] – массив измерений сигнала на входе (хранит N чисел). Первое измерение этого сигнала – техническое, используется алгоритмом БПФ.

tm[] – массив значений моментов времени измерений сигнала (хранит N чисел)

No – номер крайнего значения в накопленном массиве измерений сигнала. Изменяется от 0 до N – 1; после появления N-го значения сигнала сохраняется значение No = N – 1.

 

CFreq – минимальная частота регистрации сигнала на входе, при которой производится расчет спектра. В некоторых случаях, из-за сбоев или задержек в каналах измерений, частота регистрации падает. Проводить расчет спектра в этих случаях не имеет смысла.

Otsechka – признак отказа от расчета спектра при частоте регистрации, меньшей CFreq.

 

Flt – простейший сглаживающий фильтр, предназначенный для сглаживания значений моментов времени. Такое сглаживание имеет смысл применять в том случае, если известно, что регистрация сигнала производится с постоянной частотой, но, по причине задержек в канале, частота регистрации «гуляет». Фильтр имеет передаточную функцию 1 / (Tp + 1). Чтобы отключить фильтр, достаточно при расчете переменной dT вместо dT = Flt.Go(tm[N - 1] - tm[0] + dt); написать dT = tm[N - 1] - tm[0] + dt;

fH, fT – параметры сглаживающего фильтра.

 

Переменные на выходе БПФ:

A (массив из N чисел) – набор амплитуд спектра.

freq (массив из N чисел) – набор частот спектра.

После удаления зеркального эффекта используется только N/2 точек спектра.

 

Все остальные переменные не используются программистом при работе с классом.

 

Функции класса FFT:

Prepare() – функция расчета поворачивающих множителей; выполняется один раз перед началом работы с поступающим сигналом. Набор поворачивающих множителей зависит только от заданного числа T, поэтому данная функция запускается один раз перед расчетами спектра по поступающему сигналу.

PutVal() – функция подготовки данных в массивах tm и Xre и в других переменных перед очередным расчетом спектра.

Spectrum() – расчет спектра.

 

Примечание. В классе реализовано удаление зеркального эффекта, но отсутствует обработка эффекта размазывания. Предполагается, что программист сам применит тот метод борьбы с размазыванием, который больше подходит для конкретного сигнала.

 

 

Встраивание класса FFT на конкретном примере

 

Исходники примера   (обновлено 07.08.2017, см. примечание внизу!)

 

Проект testfft создан в среде Borland Builder 6 предназначен для опробования класса FFT: пользователь может задавать амплитуды и частоты 3-х гармоник и наблюдать на экране спектр получившегося сигнала при разных количествах точек спектра (параметр T – степень числа 2 и разных частотах регистрации.

 

Исходный код проекта состоит из 4-х unitов:

umain – пользовательский интерфейс; здесь производится ввод параметров, создание нити (thread), объекта fft класса FFT, их инициализация и запуск, прием и вывод на форму поступающей от этих объектов информации;

thr – нить, формирующая и передающая информацию объекту fft;

fft – здесь находится класс FFT;

flt – здесь находится сглаживающий фильтр.

 

umain:

В обработчике нажатия кнопки «СТАРТ» производится создание и инициализация объектов Thr (нити) и fft (БПФ), запуск функции Prepare() (расчет поворачивающих множителей) и запуск нити функцией Resume().

Обработчик закрытия формы останавливает нить и удаляет созданные объекты.

Таймер перерисовывает график, отображая на нем текущие результаты расчета спектра.

 

thr:

Функция Look() выполняется с частотой, зависящей от частоты вашего процессора. В ней выполняется расчет гармоник и значений времени (по заданной частоте дискретизации samplingFR) и передача этих данных алгоритму БПФ для очередного расчета спектра.

 

 

Примечание (обновление класса)

 

В практических приложениях часто возникает необходимость рассчитывать АЧХ, изменяющуюся в режиме онлайн. Расчет можно проводить с разным шагом. Если, например, получив данные сигнала X0, …, XN–1, мы получаем на выходе первый набор амплитуд и частот, а получив следующее наблюдение XN, мы рассчитываем по X1, …, XN следующий набор – то, в таком случае, мы считаем АЧХ с шагом 1.

В случае достаточно большой частоты регистрации считать АЧХ на каждом шаге нерационально, т.к. это занимает слишком много времени. Поэтому функция класса FFT PutVal(void) заменена на PutVal(bool c). Если c = true, функция сообщает алгоритму БПФ вновь поступившие данные и рассчитывает АЧХ. Если же c = false, происходит передача данных, но расчет не производится.

В класс TThr нашего примера добавлена переменная step, получающая значение с формы (поле Шаг расчета). Как можно увидеть в исходниках примера, функция PutVal(c) запускается с переменной c = true с частотой, заданной step, что ускоряет расчет и позволяет выводить на экран изменяющийся спектр сигнала в реальном времени или еще быстрее, в зависимости от задачи.

 

 

Интересные книжки:

 

Г. Дженкинс, Д. Ваттс,  «Спектральный анализ и его приложения - Выпуск I»

Г. Дженкинс, Д. Ваттс,  «Спектральный анализ и его приложения - Выпуск II»

Г.С. Ханян,  «Некоторые аспекты конструирования и вычисления дискретной функции когерентности двух сигналов»

 

 


Рейтинг@Mail.ru