Документация Engee
Notebook

Анализ кепстра

Данный пример нацелен на сравнение функций анализа кепстра в Engee и MATLAB. Ниже приведены два кода — для каждой из этих сред.

В Engee для выполнения анализа кепстра можно использовать пакеты FFTW и стандартные функции для выполнения преобразования Фурье. Далее представлены реализованные нами функции.

In [ ]:
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
Out[0]:
rceps (generic function with 1 method)
In [ ]:
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)
Out[0]:

В MATLAB для выполнения анализа кепстра можно использовать стандартные функции.

  1. cceps(x) выполняет комплексный кепстр.
  2. icceps(x) выполняет обратный комплексный кепстр.
  3. rceps(x) выполняет действительный кепстр.
In [ ]:
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
"""
In [ ]:
load( "$(@__DIR__)/cep.jpg" )
Out[0]:
No description has been provided for this image

Вывод

В MATLAB есть встроенные функции для выполнения этих операций. В Engee под эту задачу можно использовать сторонние библиотеки, такие, как DSP или FFTW для более сложных операций с сигналами. Также важно учесть, что Engee даёт больше гибкости в том, как можно реализовать преобразования. Чтобы упростить выполнение этих операций для реализации ваших задач в Engee, используйте готовые подходы, описанные в данной демонстрации.

Ещё один аспект в сравнении возможностей двух сред говорит о том, что MATLAB оптимизирован под работу с матрицами и сигналами. Однако Engee в целом быстрее в вычислениях, если код написан с учетом особенностей этой среды, и это даёт существенный прирост по скорости выполнения и тестирования алгоримах в больших системах.