Engee 文档
Notebook

Cepstra 分析

本例旨在比较 Engee 和 MATLAB 中的 cepstra 分析功能。以下是两个环境的代码。

在 Engee 中,您可以使用 FFTW 软件包和标准函数来执行傅立叶变换,从而进行 cepstra 分析。 以下是我们实现的函数。

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 中,可以使用标准函数来执行 cepstr 分析。

  1. cceps(x) 执行复数 cepstr。
  2. icceps(x) 执行反向复数 cepstr。
  3. rceps(x) 执行有效的 cepstr。
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 的计算速度通常会更快,这将显著提高大型系统中算法的执行和测试速度。