Содержание
Для создания режекторного фильтра Баттерворта (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('Амплитуда');
Этот код:
- Определяет частоты режекторного фильтра.
- Рассчитывает коэффициенты фильтра Баттерворта с помощью функции butter.
- Отображает рассчитанные коэффициенты числителя (b) и знаменателя (
).a>
- Строит частотную характеристику фильтра.
- Создает тестовый сигнал, содержащий частоты 450 МГц, 550 МГц и 650 МГц.
- Применяет фильтр к тестовому сигналу.
- Отображает исходный и отфильтрованный сигналы.
Этот пример демонстрирует, как создать и применить режекторный фильтр Баттерворта для удаления частотного диапазона от 500 МГц до 600 МГц.
Построение фильтра на ПЛИС на языке 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

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