Анализ кепстра
Анализ кепстра
Данный пример нацелен на сравнение функций анализа кепстра в Engee и MATLAB. Ниже приведены два кода — для каждой из этих сред.
В Engee для выполнения анализа кепстра можно использовать пакеты FFTW и стандартные функции для выполнения преобразования Фурье.
Далее представлены реализованные нами функции.
using FFTW # Для выполнения быстрого преобразования Фурье
# Комплексный кепстр
function cceps(x::Vector{Float64})
X = fft(x,1) # Фурье-преобразование
p = atan.(imag(X), real(X))
log_mag = complex.(log.(abs.(X)),p) # Логарифм модуля спектра (добавляем малое значение для стабильности)
cepstrum = real(ifft(log_mag,1)) # Обратное преобразование Фурье
return cepstrum
end
# Обратный комплексный кепстр
function icceps(c::Vector{Float64})
exp_spectrum = exp.(fft(c,1)) # Экспонента спектра
signal = real(ifft(exp_spectrum,1)) # Обратное преобразование Фурье
return signal
end
# Действительный кепстр
function rceps(x::Vector{Float64})
X = fft(x,1)
log_mag = log.(abs.(X) .+ 1e-10) # Логарифм модуля (с добавлением стабилизатора)
cepstrum = real(ifft(log_mag))
return cepstrum
end
x = sin.(1:0.5:100) # Входной сигнал
cepstrum = cceps(x)
restored_signal = abs.(icceps(cepstrum))
real_cepstrum = abs.(rceps(x))
# # Визуализация
p1 = plot(abs.(cepstrum), title="Cepstrum", ylabel="Magnitude")
p2 = plot(abs.(restored_signal), title="Restored Signal", ylabel="Amplitude")
p3 = plot(abs.(real_cepstrum), title="Real Cepstrum", ylabel="Amplitude")
plot(p1, p2, p3, layout=(3,1), legend=false)
В MATLAB для выполнения анализа кепстра можно использовать стандартные функции.
- cceps(x) выполняет комплексный кепстр.
- icceps(x) выполняет обратный комплексный кепстр.
- rceps(x) выполняет действительный кепстр.
using MATLAB
mat"""
% Комплексный кепстр
ccep = cceps($(x));
% Обратный комплексный кепстр
iccep = icceps(ccep);
% Действительный кепстр
rcep = rceps($(x));
% Визуализация результатов
subplot(3,1,1), plot(abs(ccep)), title('Cceps');
subplot(3,1,2), plot(abs(iccep)), title('Icceps');
subplot(3,1,3), plot(abs(rcep)), title('Rceps');
saveas(gcf, 'cep.jpg'); % Сохраняет текущую фигуру как JPG
"""
load("$(@__DIR__)/cep.jpg")
Вывод
В MATLAB есть встроенные функции для выполнения этих операций. В Engee под эту задачу можно использовать сторонние библиотеки, такие, как DSP или FFTW для более сложных операций с сигналами. Также важно учесть, что Engee даёт больше гибкости в том, как можно реализовать преобразования. Чтобы упростить выполнение этих операций для реализации ваших задач в Engee, используйте готовые подходы, описанные в данной демонстрации.
Ещё один аспект в сравнении возможностей двух сред говорит о том, что MATLAB оптимизирован под работу с матрицами и сигналами. Однако Engee в целом быстрее в вычислениях, если код написан с учетом особенностей этой среды, и это даёт существенный прирост по скорости выполнения и тестирования алгоримах в больших системах.