Сравнение MATLAB и Engee в задачах спектрального и частотно-временного анализа
Сравнивая MATLAB и Engee в областях спектрального анализа и частотно-временного анализа, рассмотрим их возможности и подходы для двух задач: прямое и обратное преобразование Фурье и частотно-временной анализ.
Зададим случайный входной сигнал.
Pkg.add(["DSP"])
x_in = randn(300)
plot(x_in)
Спектральное преобразование Фурье (FFT и IFFT)
В Engee используются функции из пакета FFTW:
- fft: прямое быстрое преобразование Фурье.
- ifft: обратное преобразование Фурье.
using FFTW
# Прямое преобразование Фурье
X = fft(x_in)
# Обратное преобразование Фурье
x_e = ifft(X)
В MATLAB имеются встроенные функции для быстрого преобразования Фурье:
- fft: прямое быстрое преобразование Фурье.
- ifft: обратное быстрое преобразование Фурье.
using MATLAB
# Прямое преобразование Фурье
mat"""X = fft($(x_in));"""
# Обратное преобразование Фурье
x_m=mat"""ifft(X);"""
Сравним результаты и рассчитаем погрешность.
plot(x_in)
plot!(real(x_e))
plot!(x_m)
error_e = abs.(x_in-real(x_e))
error_m = abs.(x_in-x_m)
println("Средняя ошибка Engee: $(sum(error_e)/length(error_e))")
println("Средняя ошибка MATLAB: $(sum(error_m)/length(error_m))")
В обоих средах результат прямого преобразования Фурье представляет собой комплексные числа, а обратное преобразование возвращает исходный сигнал с небольшой погрешностью, связанной с численным округлением.
Таким образом, вы можете видеть, что синтаксис и логика кода идентичны.
Частотно-временное преобразование Фурье
В Engee под такие преобразования нет стандартных функций, и их необходимо реализовывать вручную.
using DSP
# Функция для генерации чирп-сигнала
function chirp(t::AbstractVector{T}, f0::T, t1::T, k::T) where T<:Real
return cos.(2π * (f0 .* t .+ 0.5 * k .* t.^2))
end
# Окно Хэмминга
function hamming(N::Int)
n = 0:N-1
return 0.54 .- 0.46 .* cos.(2π * n / (N - 1))
end
x = chirp(0:0.001:1, 0.0, 1.0, 100.0) # Чирп-сигнал
l=500 # Размер окна
window=vcat(hamming(l),zeros(length(x)-l))
P = DSP.periodogram(x; fs=1000, window=window, nfft=length(x))
# Визуализация спектра
plot(freq(P), 20*log10.(power(P)), xlabel="Frequency (Hz)", ylabel="Power Spectrum (dB)", title="Power Spectrum", linewidth=2)
MATLAB имеет функцию pspectrum, которая позволяет выполнять частотно-временной анализ сигнала.
pspectrum автоматически выбирает подходящий метод анализа.
Поддерживает различные визуализации (спектрограммы, плотности мощности).
using Images
mat"""cd("$(@__DIR__)")"""
mat"""
% Частотно-временной анализ
x = chirp(0:0.001:1, 0, 1, 100);
pspectrum(x, 1000); % Частотно-временной спектр
saveas(gcf, 'frequency_time_spectrum.jpg'); % Сохраняет текущую фигуру как JPG
"""
load( "$(@__DIR__)/frequency_time_spectrum.jpg" )
Исходя из графиков можно заметить, что основные тенденции поведения сигнала отражены в Engee. Для более детального построения графиков необходимо дополнительно реализовать более детальный расчёт окна для функции периодограммы.
Также давайте сравним корректность сгенерированных входных данных в MATLAB и Engee.
plot(mat"chirp(0:0.001:1, 0, 1, 100)"[:])
plot!(chirp(0:0.001:1, 0.0, 1.0, 100.0))
title!("Sum_error: $(sum(mat"chirp(0:0.001:1, 0, 1, 100)"[:]-chirp(0:0.001:1, 0.0, 1.0, 100.0)))")
Как мы видим, входные сигналы идентичны.
Вывод
В MATLAB есть встроенные функции для выполнения этих операций. В Engee под эту задачу можно использовать сторонние библиотеки, такие, как DSP или FFTW для более сложных операций с сигналами. Также важно учесть, что Engee даёт больше гибкости в том, как можно реализовать преобразования. Чтобы упростить выполнение этих операций для реализации ваших задач в Engee, используйте готовые подходы, описанные в данной демонстрации.
Ещё один аспект в сравнении возможностей двух сред говорит о том, что MATLAB оптимизирован под работу с матрицами и сигналами. Однако Engee в целом быстрее в вычислениях, если код написан с учетом особенностей этой среды, и это даёт существенный прирост по скорости выполнения и тестирования алгоримах в больших системах.