Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400213.doc
Скачиваний:
6
Добавлен:
30.04.2022
Размер:
4.13 Mб
Скачать

1. Модульная схема программы

Программа, реализующая расчёт параметров нерекурсивных цифровых фильтров без умножителей написана в визуальной среде разработки Borland Delphi 5.0 для операционной системы Microsoft Windows. Программа реализованная в данной среде является оконным приложением операционной системы Microsoft Windows. Исходный код программы состоит из четырёх модулей, среди которых основными являются модуль DigFiltr.pas и Input.pas. Модуль Izobr.pas служит для отображения симметричной части коэффициентов цифрового фильтра с булевыми переменными.

Общая структурная схема программы представлена на рис П.1.

Модуль, содержа-щий стандартные функции

Модуль расчёта параметров и структуры фильтра

Модуль, содержащий функции поддержки графики

Модуль графического отображения результатов

Рис. П.1. Модульная схема программы

Основным модулем программы, связанным с математическим расчётом и последующей оптимизацией параметров и структуры фильтра является модуль DigFiltr.pas. На рис. П.2 представим функционирование этого модуля в виде структурной схемы взаимодействия его укрупнённых блоков, каждый из которых отвечает за решение определённой задачи.

2. Описание программы

Опишем основной модуль программы, отвечающий за расчёт и оптимизацию ЦФ – DigFiltr.pas. Среди глобальных переменных, объявленных в этом модуле следует выделить следующие. Переменная DisFreq определяет частоту дискретизации ЦФ, а переменная Scount – симметричную часть вектора коэффициентов ЦФ. Верхняя частота полосы задерживания АЧХ задаётся переменной MaxFreq, а нижняя частота – переменной MinFreq. Переменная InitGroupWidth определяет число коэффициентов в группе, при разбиении вектора коэффициентов на группы. Перечисленные переменные являются входными данными программы.

Рис.П.2. Структурная схема процесса функционирования основного модуля программы

Также следует отметить постоянные переменные, которые определяют параметры оптимизации. К ним относятся: переменная Cpoints, значение которой равно 500. Данная переменная определяет число точек, по которым рассчитывается максимальное значение АЧХ в полосе задерживания. Значение переменной MaxGroupGZSteps равно максимальному числу покоординатных спусков в группе на каждом цикле оптимизации группы. Максимальное число циклов оптимизации группы определяет переменная MaxGroupRndSteps, а за максимальное число циклов оптимизации по всем группам отвечает переменная MaxAllGroupsSteps. Для остановки процесса оптимизации используется переменная MaxGroupBadSteps, значение которой равно числу подряд неудачных реализаций цикла оптимизации группы, после которого оптимизация группы завершается. Переменная MaxAllGroupsBadSteps служит той же цели и её значение равно числу подряд неудачных реализаций цикла оптимизации по группам, после которого процесс оптимизации завершается.

Значения вектора коэффициентов ЦФ хранится в массиве DimX. Массивы DimX1 и DimX3 служат для восстановления прежнего состояния вектора коэффициентов или запоминания нового состояния. Все указанные массивы булевого типа, каждый элемент которых определяет значение определённого коэффициента ЦФ. Если i-й элемент массива равен 1 (true), то значение i-го коэффициента ЦФ равно 1, если он равен 0 (false) – значение i-го коэффициента ЦФ равно 0. Индекс i отсчитывается от центрального коэффициента ЦФ, так как в массиве DimX хранится только половина коэффициентов ЦФ – его симметричная часть. Индекс i=0 соответствует центральному коэффициенту, значение которого всегда равняется 1.

В программе реализовано три способа первоначального заполнения массива DimX. Процедура Random_DimX осуществляет заполнение массива случайным образом. Элементы массива с индексами больше Scount заполняются нулями. Оставшиеся элементы в описываемой процедуре заполняются с помощью генератора случайных чисел. Процедура Full_DimX работает аналогично, только все элементы от 1 до Scount заполняются единицами.

За заполнение массива DimX инженерным методом отвечают несколько процедур. Сначала с помощью процедуры CreateGroups осуществляется первоначальное деление коэффициентов на группы с числом коэффициентов в каждой равной значению переменной InitGroupWidth. Затем процедура EngDimX реализует инженерный метод заполнения массива. В качестве весовой функции выбирается функция Хэмминга. Ее значения номера среднего коэффициента каждой группы рассчитываются по формуле (2.1) и затем рассчитывается число коэффициентов, которые следует оставить равными единице. Если получается, что в группе должно остаться менее двух коэффициентов равных единице, то увеличиваем размер группы и повторяем расчет.

Заполнение групп происходит следующим образом: сначала значения всех коэффициентов в группе приравниваются нулю (DimX[i]=0). После чего вычисляем номер первого единичного коэффициента в группе StartS и номер последнего единичного коэффициента в группе EndS, с учётом того, что коэффициенты равные 1 должны располагаться в центре группы симметрично относительно среднего коэффициента группы. Далее элементы массива DimX, попавшие в этот предел заполняются единицами.

Значение АЧХ ЦФ, соответствующее текущему вектору коэффициентов DimX и заданной частоте, рассчитывается функцией Dig_AC в соответствии с формулой (1.49). Нормализованное значение АЧХ возвращает функция Dig_AC_Norm. Перед первым ее вызовом необходимо вызывать функцию Precalc_ Dig_AC для определения значения АЧХ при центральной частоте – коэффициента нормализации. Для перевода значений АЧХ в логарифмический масштаб служит функция AC_Function, аргументом которой является частота.

Функция minf реализует поиск частоты , разграничивающей первый и второй лепестки текущей АЧХ. Поиск минимума функции осуществляется простым перебором значений с шагом, который задается переменной step. Функция searchmin реализует тот же поиск, только при АЧХ ЦФ у которого все коэффициенты выставлены в единицу. Функция search3 осуществляет поиск частоты, где значение АЧХ ЦФ, весь вектор коэффициентов заполнен единицами, равно трём децибелам.

Похожим способом функция Search_MaxC осуществляет поиск наибольшего значения АЧХ в полосе задержания , где задается переменной MaxFreq, а задаётся возвращаемым на момент поиска значением функции minf. Число точек, по которым осуществляется поиск задается переменной Cpoints. Переменные FminPoints и Cpoints во многом определяют быстродействие программы.

В процедурах оптимизации за заполнение группы случайным образом отвечает процедура RandomGroup. Заполнение происходит путём перевода десятичного числа, определяемого в соответствии с алгоритмом, описанным в пункте 2.2 в двоичное и присвоение полученных значений 0 и 1 соответствующим коэффициентам группы. За перевод десятичного числа в двоичное с заполнением массива ps с числом элементов равных количеству стержней n в группе отвечает процедура tobin, входными данными для которой являются десятичное число и количество стержней в группе.

Функция OptGroupGZ реализует часть алгоритма оптимизации – покоординатный спуск, соответствующий шагам 2-3 алгоритма. Она проходит по всем элементам массива DimX. Изменяя значение очередного элемента, программа определяет, произошло ли улучшение целевой функции, и не ухудшился ли показатель прямоугольности более, чем на заданную ошибку и в соответствии с результатом оставляет одно из двух значений. Таким образом осуществляется один покоординатный спуск.

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

Функция OptimizeGroup осуществляет полный цикл оптимизации одной группы. Сначала запоминается значение целевой функции, которое было до оптимизации данной группы и вектор коэффициентов ЦФ. Работа данной функции состоит в циклическом вызове функции OptimizeOneRandomGroup и сравнении результатов ее последовательных реализаций, то есть в цикле после каждого вызова функции OptimizeOneRandomGroup проверяется значение целевой функции и ограничения на прямоугольность АЧХ. Если реализация неудачна, то увеличиваем счетчик неудачных реализаций на 1. При достижении заданного числа подряд неудачных реализаций (определяется переменной MaxGroupBadSteps) выходим из цикла. После каждой удачной реализации запоминаем новое состояние вектора группы коэффициентов ЦФ с помощью процедуры CopyGroup, а также новое значение целевой функции. Если в ходе работы этой функции получено значение худшее, чем было до ее запуска, то восстанавливается прежний вектор коэффициентов ЦФ, который был до оптимизации данной группы, а также прежнее значение целевой функции.

Функция OptimizationByGroups является корневой функцией оптимизации. Она полностью реализует алгоритм. Начальным приближением для данного процесса оптимизации, реализованного этой функцией, является вектор, содержавшийся в массиве DimX перед запуском этой процедуры. Сначала запоминается текущее значения целевой функции. Затем в цикле осуществляется последовательный проход по всем группам с оптимизацией каждой с помощью функции OptimizeGroup, причём процесс оптимизации можно остановить в любой момент. Если последовательно будет несколько неудачных циклов оптимизации (число которых определяет переменная MaxAllGroupsBadSteps), то процесс оптимизации завершается.

Для просмотра результатов и интерактивного доступа к синтезированной структуре ЦФ с оптимизированными ЧХ в программе предусмотрен отдельный модуль izobr.pas, который позволяет вручную выставлять значение требуемого коэффициента в 0 или 1.

Для ввода исходных данных в программу предназначен отдельный модуль Input.pas, который обеспечивает ввод частоты дискретизации ЦФ, числа коэффициентов его симметричной части, верхней частоты полосы задерживания, а также ввода паспорта фильтра с единичными коэффициентами.

После окончания процедур оптимизации и просмотра результатов полученные данные можно вывести в текстовые файлы с помощью процедур SaveDimXToFile – обеспечивает вывод в файл вектора коэффициентов ЦФ для возможного последующего использования его в среде MatLab; SaveAcToFile - вывод в файл таблицы значений АЧХ ЦФ. Также существует возможность первоначального задания вектора коэффициентов ЦФ из файла для последующей оптимизации с помощью процедуры LoadDimXFromFile.

Для нахождения оптимального паспорта (разбиения) фильтра с единичными коэффициентами в программе служит процедура comb2. В ней задаётся максимальное значение m1, равное порядку фильтра минус максимальное число элементов последовательности, на которое данный порядок будет разбиваться (задаётся априорно). После этого осуществляется обращение к процедуре comb1, которая в соответствии с комбинаторным алгоритмом осуществляет разбиение оставшегося числа на последовательности, среди которых рассматриваются только те из них, которые не противоречат заранее поставленным условиям. Этими условиями являются: максимальное значение max1 среди последовательности не должно превышать заранее заданного, число единиц num1 в последовательности не должно превышать четырёх, разница между чётными и нечётными числами должна быть не больше пяти. оставшегося общего значения. Если все условия выполняются, то осуществляется отбор разбиений по критериальным условиям, и идёт возврат к процедуре comb1, где снова задаётся новое максимальное значение m1. Процедура перебора заканчивается, когда максимальное значение m1 получается меньше либо равным единице, при том условии, что ошибка e3 на ширину полосы пропускания по заданным уровням становится наименьшей.

За основные функции, связанные с выводом графики, такие как построение графического изображения фильтра – отвечает компонента Tchart.