频谱包络提取的MATLAB实现
废话少说
上代码
clear, clc, close all
% 加载音频文件
[x, fs] = audioread('track.wav', [1 4096]);
x = x(:, 1);
% 进行频谱分析
N = length(x);
w = hanning(N, 'periodic');
[Xamp, f] = periodogram(x, w, N, fs, 'power');
Xamp = 20*log10(sqrt(Xamp)*sqrt(2));
% 谱包络提取
Xenv = specenv(Xamp, f);
% 绘制频谱及包络线
plot(f, Xamp)
grid on
hold on
plot(f, Xenv, 'r', 'LineWidth', 1.5)
xlim([0 max(f)])
set(gca, 'FontName', 'Times New Roman', 'FontSize', 14)
xlabel('Frequency, Hz')
ylabel('Magnitude, dB')
title('Amplitude spectrum of the signal and its envelope')
legend('Original spectrum', 'Spectral envelope')
specenv函数,通过保持光谱峰值形状的分段三次插值和对结果的移动平均过滤提取光谱包络(跨度= 5),如下:
function Xenv = specenv(Xamp, f)
[Xpks, pksind] = findpeaks(Xamp+eps);
fpks = (pksind-1)*(f(2) - f(1));
Xenv = interp1(fpks, Xpks, f, 'pchip');
Xenv = smooth(Xenv);
end
结果:
音频数据点这里
转自
mathwork