MATLAB与Engee在谱分析与时频分析任务中的比较
在频谱分析与时频分析领域比较 MATLAB 和 Engee 时,我们将针对两个任务——傅里叶正变换与逆变换以及时频分析——探讨它们的功能和方法。
设一个随机输入信号。
In [ ]:
Pkg.add(["DSP"])
In [ ]:
x_in = randn(300)
plot(x_in)
Out[0]:
傅里叶谱变换(FFT 和 IFFT)
在 Engee 中使用了 FFTW 包中的函数:
- fft:正向快速傅里叶变换。
- ifft:逆快速傅里叶变换。
In [ ]:
using FFTW
# 傅里叶正变换
X = fft(x_in)
# 傅里叶逆变换
x_e = ifft(X)
Out[0]:
在 MATLAB 中,提供了用于快速傅里叶变换的内置函数:
- fft:正向快速傅里叶变换。
- ifft:逆快速傅里叶变换。
In [ ]:
using MATLAB
# 傅里叶正变换
mat"""X = fft($(x_in));"""
# 傅里叶反变换
x_m=mat"""ifft(X);"""
Out[0]:
让我们比较结果并计算误差。
In [ ]:
plot(x_in)
plot!(real(x_e))
plot!(x_m)
Out[0]:
In [ ]:
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中,此类变换没有标准函数,需要手动实现。
In [ ]:
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)
Out[0]:
MATLAB 提供了 pspectrum 函数,可用于对信号进行时频分析。
pspectrum 会自动选择合适的分析方法。
支持多种可视化形式(频谱图、功率密度图)。
In [ ]:
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" )
Out[0]:
从图表中可以看出,信号行为的主要趋势在 Engee 中得到了反映。若要绘制更详细的图表,需要额外实现更精细的周期图函数窗口计算。
此外,让我们比较一下在 MATLAB 和 Engee 中生成的输入数据的正确性。
In [ ]:
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)))")
Out[0]:
如我们所见,输入信号完全一致。
结论
MATLAB 提供了用于执行这些操作的内置函数。 在 Engee 中,可以利用第三方库(如 DSP 或 FFTW)来处理更复杂的信号运算。此外,需要注意的是,Engee 在变换的实现方式上提供了更大的灵活性。 为了简化在 Engee 中实现这些操作以完成您的任务,请使用本演示中描述的现成方法。
在比较这两种环境的能力时,还有一点需要注意:MATLAB 针对矩阵和信号处理进行了优化。 然而,如果代码在编写时充分考虑了 Engee 环境的特性,Engee 的计算速度通常会更快,这在大型系统中执行和测试算法时能带来显著的速度提升。
.png)