如何使用MATLAB得到与商用软件一致的Cepstrum(倒谱)计算结果
你使用MATLAB内置的cceps、rceps函数得到的结果和商用软件不一致,核心是计算逻辑不匹配:绝大多数工业领域商用分析软件默认输出的是功率倒谱(Power Cepstrum),而非复倒谱或实倒谱。
功率倒谱的计算逻辑为:
时域信号 → 傅里叶变换 → 计算功率谱(幅值平方)→ 对功率谱取对数 → 逆傅里叶变换取实部
MATLAB的rceps是对傅里叶变换的幅值取对数后做逆变换,和功率倒谱差了2倍的系数;cceps则是对复频谱做相位解绕后的复对数逆变换,和常规工程场景用的倒谱差异更大。此外你当前代码直接对全段信号做计算,未做加窗、预加重等常规预处理,也会和商用软件的默认处理流程产生偏差。
整段信号功率倒谱实现(和你现有代码逻辑对齐)
%% 功率倒谱计算(适配商用软件默认逻辑) % 加载信号 A = importdata('21.txt'); M = A(:,2); Fs = 1552; L = length(M); % 预处理:预加重提升高频分量,加汉明窗减少频谱泄漏 M = filter([1 -0.97], 1, M); win = hamming(L); M = M .* win; % 核心计算流程 Y = fft(M); P = abs(Y).^2 / L; % 计算功率谱 logP = log(P); % 对功率谱取自然对数 cep = real(ifft(logP)); % 逆变换取实部得到功率倒谱 % 倒频率轴(单位:秒) q = (0:L-1)/Fs; % 绘图 plot(q, cep) xlabel('Quefrency (s)') ylabel('Amplitude') title('Power Cepstrum') ylim([0 0.2]); xlim([0 4.6]);
分帧平均功率倒谱实现(适配商用软件短时处理逻辑)
如果商用软件采用分帧处理的短时分析逻辑,可使用如下代码:
%% 分帧平均功率倒谱计算 A = importdata('21.txt'); M = A(:,2); Fs = 1552; % 分帧参数,可根据商用软件配置调整:帧长256,帧移128,汉明窗 frame_len = 256; frame_shift = 128; win = hamming(frame_len); frames = buffer(M, frame_len, frame_len - frame_shift, 'nodelay'); frames = frames .* win; % 逐帧计算功率倒谱 cep_frames = zeros(frame_len, size(frames, 2)); for i = 1:size(frames, 2) Y = fft(frames(:,i)); P = abs(Y).^2 / frame_len; logP = log(P); cep_frames(:,i) = real(ifft(logP)); end % 计算平均倒谱并绘图 cep_mean = mean(cep_frames, 2); q = (0:frame_len-1)/Fs; plot(q, cep_mean) xlabel('Quefrency (s)') ylabel('Amplitude') title('Average Power Cepstrum')
调整说明
若结果仍有偏差,可对应调整预加重系数、窗函数类型、分帧参数,若商用软件对输出做了绝对值、归一化处理,也可在输出环节对应调整即可。
内容的提问来源于stack exchange,提问作者user33834
相关产品推荐
相关产品推荐

