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在计算方面通常会更快,这大大提高了大型系统中执行和测试算法的速度。
