ΣSigmaStudio English

FIR-фильтр


Обзор

Обзор Блок FIR (finite impulse response) позволяет реализовать любой желаемый КИХ-фильтр.

  1. Перетащите блок в рабочую область.
  2. Нажмите «Таблица».
  3. Введите коэффициенты, рассчитанные с помощью выбранного вами программного обеспечения (см. ниже). (Максимум — 800.)

АЧХ можно формировать, задавая соответствующие коэффициенты фильтра, как показано здесь:

Обзор

Вы можете использовать это всплывающее окно для ввода любого количества дополнительных коэффициентов, создавая тем самым свой собственный FIR-фильтр. (Помните: чем больше чисел, тем ближе к идеальному БИХ-фильтру, но ценой использования памяти.)

Существуют программы САПР, упрощающие проектирование FIR-фильтров нижних частот, верхних частот, полосовых или режекторных фильтров. Популярная программа была разработана Парксом и Макклелланом и использует алгоритм обмена Ремеза. Проектирование начинается с задания таких параметров, как пульсации в полосе пропускания, пульсации в полосе задерживания [затухание] и переходная область. Одной из таких программ САПР является QED1000 от Momentum Data Systems; бесплатную версию можно загрузить с www.mds.com.

АЧХ коэффициентов фильтра, показанных на рисунке редактора таблиц RMS выше, представлена ниже:

Обзор

Чтобы добавить наборы входов/выходов, щелкните правой кнопкой мыши и выберите «Добавить алгоритм», IC1, FIR. После установки алгоритма по умолчанию к этому блоку можно добавлять алгоритмы. (Если вы используете более одной платы DSP, вам необходимо добавить исходный алгоритм по умолчанию для нужной платы.) Щелкните правой кнопкой мыши блок и выберите «Добавить алгоритм» > «IC N» > «Фильтр розового шума». Это добавит еще один набор входных/выходных пинов для подключения.

Для получения справочной информации и теории см. Алгоритм FIR-фильтра.

Написание скриптов для FIR-фильтра из Python

Сначала установите соединение между Python и SigmaStudio, как описано на странице Написание скриптов SigmaStudio из Python.

После установления соединения между Python и SigmaStudio FIR-фильтр можно обновить новыми коэффициентами, используя следующий код.

Здесь fir_filter_coeffs — это список, содержащий коэффициенты, а 'FIR1' — имя блока FIR в SigmaStudio.

fir_filter_coeffs = [0.1, 0.8, 0, 0.3, 0, 1, 0.7]
v_obj = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, fir_filter_coeffs)
server.SET_OBJECT_PROPERTY('setControlValue', 'FIR1', 0, 0, 'Number_of_Coeffs', len(fir_filter_coeffs))
# Обновите коэффициенты в SigmaStudio; это возвращает схему в режим проектирования...
server.SET_OBJECT_PROPERTY('setControlValue', 'FIR1', 0, 0, 'Coefficients', v_obj)
# поэтому перекомпилируйте проект.
server.COMPILE_PROJECT

Коэффициенты FIR-фильтра также можно считать с помощью Python:

def print_object_property(block_name, param_name, grow_idx, repeat_idx):
    arg1 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, 'getControlValue')
    arg2 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, block_name)
    arg3 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, [])
    arg4 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, grow_idx)
    arg5 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, repeat_idx)
    arg6 = VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, param_name)
 
    server.GET_OBJECT_PROPERTY(arg1, arg2, arg3, arg4, arg5, arg6)
 
    print(block_name + ': ' + param_name + ' has value ' + str(arg4.value[0]))
 
print_object_property('FIR1', 'Coefficients', 0, 0)

Управление FIR-фильтром с микроконтроллера

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

Чтение коэффициентов FIR из SigmaDSP

// ПРИМЕЧАНИЕ: Этот код не будет работать для очень больших фильтров, которые охватывают несколько блоков памяти данных или страниц памяти.
void print_FIR_coeffs(int fir_start_addr, int fir_filter_length) {
    // Инициализируйте массив double для хранения коэффициентов.
    double fir_coeffs[fir_filter_length] = {};
 
    for (int i = 0; i < fir_filter_length; i++) {
        // Память DSP хранит коэффициенты FIR в обратном порядке, поэтому заполняйте массив fir_coeffs с последнего по первый.
        fir_coeffs[fir_filter_length - i - 1] = SIGMA_READ_REGISTER_FLOAT(fir_start_addr + i);
    }
 
    // На этом этапе вы можете делать с fir_coeffs всё, что угодно. Мы просто выведем их.
    Serial.println("FIR Coefficients:");
    for (int i = 0; i < fir_filter_length; i++) {
        Serial.println(fir_coeffs[i], 4);
    }
}

Запись коэффициентов FIR в SigmaDSP

// ПРИМЕЧАНИЕ: Этот код не будет работать для очень больших фильтров, которые охватывают несколько блоков памяти данных или страниц памяти.
void write_FIR_coeffs(int fir_start_addr, int fir_filter_length, double* coefficients) {
    for (int i = 0; i < fir_filter_length; i++) {
        // Память DSP хранит коэффициенты FIR в обратном порядке, поэтому увеличивайте адрес, уменьшая индекс коэффициента.
        SIGMA_WRITE_REGISTER_FLOAT(fir_start_addr + i, coefficients[fir_filter_length - i - 1]);
    }
}

Пример использования

Если в ваш проект SigmaStudio добавлен алгоритм FIR, экспортированный исходный код будет включать информацию о переменных в файле *PARAMS.h*. Использование этих переменных для адресации позволяет вашему коду автоматически отслеживать любые изменения адреса фильтра по мере усложнения вашего проекта SigmaStudio.

// Выведите коэффициенты, содержащиеся в программе по умолчанию
print_FIR_coeffs(MOD_FIR1_ALG0_FIRSIGMA300ALG1FIRCOEFF0_ADDR, MOD_FIR1_COUNT);
// Создайте массив новых коэффициентов
double new_coefficients[MOD_FIR1_COUNT] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
// Запишите новые коэффициенты FIR в DSP
write_FIR_coeffs(MOD_FIR1_ALG0_FIRSIGMA300ALG1FIRCOEFF0_ADDR, MOD_FIR1_COUNT, new_coefficients);
// Считайте коэффициенты обратно; теперь они должны быть идентичны new_coefficients
print_FIR_coeffs(MOD_FIR1_ALG0_FIRSIGMA300ALG1FIRCOEFF0_ADDR, MOD_FIR1_COUNT);

Controlling the FIR Filter from a Microcontroller в SigmaStudio: настройка и параметры

Блок FIR (finite impulse response) в SigmaStudio предназначен для реализации КИХ-фильтров с произвольной амплитудно-частотной характеристикой на процессорах ADAU семейства SigmaDSP от Analog Devices. В отличие от готовых фильтров нижних или верхних частот, этот компонент позволяет задать до 800 коэффициентов вручную, что открывает возможности для создания фильтров с уникальными характеристиками, включая полосовые, режекторные и многочастотные конфигурации. Принцип работы блока основан на классической схеме КИХ-фильтрации: выходной сигнал формируется как взвешенная сумма текущего и предыдущих входных отсчетов. Коэффициенты вводятся через таблицу, доступную по кнопке «Таблица» в свойствах блока. Для расчета коэффициентов можно использовать специализированное ПО, например QED1000 от Momentum Data Systems, реализующее алгоритм обмена Ремеза (метод Паркса–Макклеллана). При проектировании задаются пульсации в полосе пропускания, затухание в полосе задерживания и ширина переходной области. Для управления FIR-фильтром с микроконтроллера или из скрипта Python используется интерфейс SigmaStudio. Через команды SET_OBJECT_PROPERTY можно обновлять массив коэффициентов и параметр Number_of_Coeffs, после чего требуется перекомпиляция проекта. Чтение текущих значений коэффициентов также выполняется через этот интерфейс, что позволяет реализовать динамическую адаптацию фильтра в реальном времени. При работе с несколькими платами DSP важно добавить алгоритм FIR для каждой используемой микросхемы через контекстное меню «Добавить алгоритм».