Расчет фильтра Баттерворта MATLAB и Verilog

Содержание

Для создания режекторного фильтра Баттерворта (Band-Stop Filter) на MATLAB, который фильтрует частоты от 500 МГц до 600 МГц, можно воспользоваться функцией butter. В данном примере будем использовать фильтр Баттерворта 4-го порядка.

Вот пример кода:
% Частоты в Гц f1 = 500e6; % Нижняя частота f2 = 600e6; % Верхняя частота fs = 2e9; % Частота дискретизации (выберите достаточно высокую для точного представления сигнала) % Нормализованные частоты (делим на половину частоты дискретизации) Wn = [f1 f2] / (fs / 2); % Порядок фильтра order = 4; % Расчет коэффициентов фильтра Баттерворта [b, a] = butter(order, Wn, 'stop'); % Отображение коэффициентов disp('Коэффициенты числителя (b):'); disp(b); disp('Коэффициенты знаменателя (a):'); disp(a); % Частотная характеристика фильтра freqz(b, a, 1024, fs); % Для тестирования на сигнале, создадим сигнал с шумом t = 0:1/fs:1e-6; % Временной вектор signal = cos(2*pi*450e6*t) + cos(2*pi*550e6*t) + cos(2*pi*650e6*t); % Сигнал с частотами 450 МГц, 550 МГц и 650 МГц % Применение фильтра filtered_signal = filter(b, a, signal); % Отображение исходного и отфильтрованного сигналов figure; subplot(2,1,1); plot(t, signal); title('Исходный сигнал'); xlabel('Время (сек)'); ylabel('Амплитуда'); subplot(2,1,2); plot(t, filtered_signal); title('Отфильтрованный сигнал'); xlabel('Время (сек)'); ylabel('Амплитуда');

Этот код:

  1. Определяет частоты режекторного фильтра.
  2. Рассчитывает коэффициенты фильтра Баттерворта с помощью функции butter.
  3. Отображает рассчитанные коэффициенты числителя (
    b
    ) и знаменателя (
    a
    ).>
  4. Строит частотную характеристику фильтра.
  5. Создает тестовый сигнал, содержащий частоты 450 МГц, 550 МГц и 650 МГц.
  6. Применяет фильтр к тестовому сигналу.
  7. Отображает исходный и отфильтрованный сигналы.

Этот пример демонстрирует, как создать и применить режекторный фильтр Баттерворта для удаления частотного диапазона от 500 МГц до 600 МГц.

Построение фильтра на ПЛИС на языке Verilog

Это пример построения КИХ фильтра на ПЛИС на языке Verilog. Поэтому примеру можно построить любой фильтр. Однако, в примере приводится каноническая форма, но в ваших случаях возможно эффективно построить в другой форме.
module fir(data, clk, reset, out); parameter DN = 5; // порядок фильтра parameter K0 = 655; // коэф равный 0,02 parameter K1 = 16_384; // коэф равный 0,5 parameter K2 = 21_299; // коэф равный 0,65 parameter K3 = 36; // коэф равный 0,0011 parameter K4 = 3276; // коэф равный 0,1 parameter DATA_WIDTH = 16; // Битовая длина линии данных input signed [(DATA_WIDTH - 1): 0] data; // линия данных input reset, clk; // асинхронный сброс и тактовый сигнал output signed [(DATA_WIDTH - 1): 0] out; // выходной сигнал reg [(DATA_WIDTH - 1): 0] z [(DN - 1): 0]; // память фильтра wire [(DATA_WIDTH*2 - 1): 0] k_w [(DN - 1): 0]; // Задание начальных значений памяти фильтра initial begin z[0] = 0; z[1] = 0; z[2] = 0; z[3] = 0; z[4] = 0; end // перемножение z^(-1) регистра на коэф assign k_w[0] = z[0] * K0; assign k_w[1] = z[1] * K1; assign k_w[2] = z[2] * K2; assign k_w[3] = z[3] * K3; assign k_w[4] = z[4] * K4; assign out = (k_w[0] + k_w[1] + k_w[2] + k_w[3] + k_w[4]) >> (DATA_WIDTH - 1); always @(posedge clk, posedge reset) begin if (reset) begin // очистка памяти z[0] <= 0; z[1] <= 0; z[2] <= 0; z[3] <= 0; z[4] <= 0; end else begin z[0] <= data; z[1] <= z[0]; z[2] <= z[1]; z[3] <= z[2]; z[4] <= z[3]; end end endmodule
RTL примера модуля КИХ-фильтр 5 порядка и отчет о компиляции

Рисунок 1 — RTL примера модуля КИХ-фильтр 5 порядка.