Редактор цифровых фильтров
Редактор цифровых фильтров
В данном примере мы разберём принципы использования приложения «Редактор цифровых фильтров» на основе заранее описанного зашумлённого сигнала и применения к нему с фильтрации с конечной импульсной характеристикой.
Объявим вспомогательные функции, которые нам понадобятся в данной работе:
- функция для парсинга коэффициентов, сгенерированных «Редактором цифровых фильтров»;
- вспомогательная функия для расчёта спектра сигнала.
Pkg.add(["DSP"])
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
Теперь перейдём к определению входного сигнала и его анализу при условии, что частота дискретизации равна 1МГц.
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)
Анализируя спектр сигнала, мы видим один пик в 0 Гц. Наличие амплитудного пика на спектре сегмента указывает на наличие сильной гармонической составляющей.
Чтобы отфильтровать все частоты, кроме пиковой, амплитудно-частотная характеристика (АЧХ) фильтра должна быть плоской до частоты среза и затем резко снижаться до бесконечно малых значений для всех остальных частот.
Это может быть реализовано с помощью низкочастотного фильтра (lowpass filter). В данном случае используем оконный КИХ-фильтр. И здесь нам необходимо расчитать коэффициенты этого фильтра при помощи приложения «Редактор цифровых фильтров».
Ниже приведён пример генерации коэффициентов.
После генерации мы выполняем скачивание файлов и следом парсинг файла с коэффициентами. Помимо этого стоит обратить внимание на то, что знаменатель фильтра задан коэффициентами, равными единице, что позволяет их отбросить.
Выгрузим коэффициенты из сгенерированных TXT-файлов.
bat_num = read_coeff("$(@__DIR__)/num_coeff.txt")
Теперь объявим оконный КИХ-фильтр с ранее рассчитанными коэффициентами.
responsetype = Lowpass(5)
designmethod = FIRWindow(bat_num)
Выполним фильтрацию сигнала и сравним входные и выходные значения как самого сигнала, так и спектра.
y = filt(digitalfilter(responsetype, designmethod; fs=Fs), x)
plot(x, label="Original Signal", title="Signal")
plot!(y, label="Filtered Signal", xlabel="Sample", ylabel="Amplitude")
После фильтрации сигнал стал сглаженным, подавляя шумовые компоненты. Форма сигнала теперь лучше отражает общую тенденцию поведения сигнала.
Пиковые выбросы шума практически исчезли, что подтверждает успешную фильтрацию высокочастотных компонентов.
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")
Частоты выше 65 Гц полностью подавлены. Основные амплитуды спектра сосредоточены на частотах 0 Гц. Это говорит о том, что фильтр эффективно подавил шум выше частоты среза и позволил выделить полезный исходный сигнал.
Вывод
В данном примере были продемонстрированы возможности фильтрации сигналов в интерактивных скриптах Engee и способы применения дополнительного приложения среды – «Редактора цифровых фильтров». Мы убедились в том, что поставленные задачи выполняются корректно с помощью данных инструментов.