Kepstra分析
本示例旨在比较Engee和MATLAB中kepstra分析的功能。 以下是每个环境的两个代码。
在Engee中,用于执行傅立叶变换的FFTW包和标准函数可用于执行kepstra分析。
以下是我们实现的功能。
In [ ]:
using FFTW # 执行快速傅立叶变换
# 综合capstr
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
# 反向复数kepstr
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]:
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中,标准函数可用于执行kepstra分析。
- cceps(x)执行复杂的倒谱。
- icceps(x)执行逆复数倒谱。
- rceps(x)执行有效的cepstr。
In [ ]:
using MATLAB
mat"""
%复杂capstr
ccep = cceps($(x));
%反向复数kepstr
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]:
结论
MATLAB具有用于执行这些操作的内置函数。 在Engee中,您可以使用第三方库来完成此任务,例如DSP或FFTW来进行更复杂的信号操作。 同样重要的是要考虑到Engee在如何实现转换方面提供了更大的灵活性。 要简化Engee任务的这些操作,请使用本演示中描述的现成方法。
比较两种环境的功能的另一个方面表明,MATLAB针对处理矩阵和信号进行了优化。 然而,如果考虑到这种环境的具体情况编写代码,Engee在计算方面通常会更快,这大大提高了大型系统中执行和测试算法的速度。

