Редактор цифровых фильтров

Автор
avatar-yurevyurev
Notebook

Редактор цифровых фильтров

В данном примере мы разберём принципы использования приложения «Редактор цифровых фильтров» на основе заранее описанного зашумлённого сигнала и применения к нему с фильтрации с конечной импульсной характеристикой.

Объявим вспомогательные функции, которые нам понадобятся в данной работе:

  1. функция для парсинга коэффициентов, сгенерированных «Редактором цифровых фильтров»;
  2. вспомогательная функия для расчёта спектра сигнала.
In [ ]:
Pkg.add(["DSP"])
In [ ]:
using DSP, FFTW

function read_coeff(path)
    # Читаем TXT
    txt = open(io->read(io, String), path)
    # Заменяем \n на запятые и оборачиваем строку в []
    data_str = "[" * replace(txt, "\n" => ",") * "]"
    # Преобразуем строку в выражение
    parsed_expr = Meta.parse(data_str)
    # Выполняем выражение, чтобы получить вектор
    data_vector = eval(parsed_expr)
    return data_vector
end

function compute_spectrum(signal, fs)
    n = length(signal)
    spectrum = abs.(fft(signal)) / n
    freqs = (0:n-1) .* (fs / n)
    spectrum[1:Int(n/2)], freqs[1:Int(n/2)]  # Вернуть половину спектра (для удобства)
end
Out[0]:
compute_spectrum (generic function with 1 method)

Теперь перейдём к определению входного сигнала и его анализу при условии, что частота дискретизации равна 1МГц.

In [ ]:
Fs = 1000  # Частота дискретизации
t = 0:1/Fs:1-1/Fs  # Временной интервал
x = sin.(2π .* 0.1 .* t) .+ randn(length(t))  # Сигнал с шумом (0.1 Гц компонент и шум)

spectrum_x, freqs_x = compute_spectrum(x, Fs)
plot(freqs_x, spectrum_x, xlabel="Frequency (Hz)", ylabel="Amplitude", legend=:topright)
Out[0]:

Анализируя спектр сигнала, мы видим один пик в 0 Гц. Наличие амплитудного пика на спектре сегмента указывает на наличие сильной гармонической составляющей.

Чтобы отфильтровать все частоты, кроме пиковой, амплитудно-частотная характеристика (АЧХ) фильтра должна быть плоской до частоты среза и затем резко снижаться до бесконечно малых значений для всех остальных частот.

Это может быть реализовано с помощью низкочастотного фильтра (lowpass filter). В данном случае используем оконный КИХ-фильтр. И здесь нам необходимо расчитать коэффициенты этого фильтра при помощи приложения «Редактор цифровых фильтров».

Ниже приведён пример генерации коэффициентов.

После генерации мы выполняем скачивание файлов и следом парсинг файла с коэффициентами. Помимо этого стоит обратить внимание на то, что знаменатель фильтра задан коэффициентами, равными единице, что позволяет их отбросить.

snimok_ekrana_2024_12_17_142613.png

snimok_ekrana_2024_12_17_142637.png

Выгрузим коэффициенты из сгенерированных TXT-файлов.

In [ ]:
bat_num = read_coeff("$(@__DIR__)/num_coeff.txt")
Out[0]:
11-element Vector{Float64}:
 0.08670710125932124
 0.08919851935658485
 0.0911692583414991
 0.0925947918347827
 0.09345731482134326
 0.09374602877293467
 0.09345731482134309
 0.09259479183478204
 0.09116925834149865
 0.08919851935658467
 0.0867071012593207

Теперь объявим оконный КИХ-фильтр с ранее рассчитанными коэффициентами.

In [ ]:
responsetype = Lowpass(5; fs=Fs)
designmethod = FIRWindow(bat_num)
Out[0]:
FIRWindow{Float64}([0.08670710125932124, 0.08919851935658485, 0.0911692583414991, 0.0925947918347827, 0.09345731482134326, 0.09374602877293467, 0.09345731482134309, 0.09259479183478204, 0.09116925834149865, 0.08919851935658467, 0.0867071012593207], true)

Выполним фильтрацию сигнала и сравним входные и выходные значения как самого сигнала, так и спектра.

In [ ]:
y = filt(digitalfilter(responsetype, designmethod), x)

plot(x, label="Original Signal", title="Signal")
plot!(y, label="Filtered Signal", xlabel="Sample", ylabel="Amplitude")
Out[0]:

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

Пиковые выбросы шума практически исчезли, что подтверждает успешную фильтрацию высокочастотных компонентов.

In [ ]:
spectrum_y, freqs_y = compute_spectrum(y, Fs)

plot(freqs_x, spectrum_x, label="Original Signal Spectrum", xlabel="Frequency (Hz)", ylabel="Amplitude", legend=:topright)
plot!(freqs_y, spectrum_y, label="Filtered Signal Spectrum", title="Signal Spectrum")
Out[0]:

Частоты выше 65 Гц полностью подавлены. Основные амплитуды спектра сосредоточены на частотах 0 Гц. Это говорит о том, что фильтр эффективно подавил шум выше частоты среза и позволил выделить полезный исходный сигнал.

Вывод

В данном примере были продемонстрированы возможности фильтрации сигналов в интерактивных скриптах Engee и способы применения дополнительного приложения среды – «Редактора цифровых фильтров». Мы убедились в том, что поставленные задачи выполняются корректно с помощью данных инструментов.