Содержание
FIR-фильтр
Обзор
Блок FIR (finite impulse response) позволяет реализовать любой желаемый КИХ-фильтр.
- Перетащите блок в рабочую область.
- Нажмите «Таблица».
- Введите коэффициенты, рассчитанные с помощью выбранного вами программного обеспечения (см. ниже). (Максимум — 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);