You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab绘制音频率失真曲线结果不符预期,求助排查错误步骤

错误步骤说明

  • PSNR计算的分子错误:你当前使用量化后信号m_q的平均功率作为分子,标准计算应该采用原始音频信号x的平均功率,这是核心偏差来源。
  • 码率顺序错误:你定义的量化比特数组num = [7 4 2 1]对应的码率r是从高到低排列,直接绘图会导致折线从右向左生成,和预期曲线从左到右码率上升、失真下降的趋势不符。
  • 次要问题:自定义函数Uquant的返回值定义了N但实际没有修改,属于无效返回,不影响运行但不符合函数定义规范。

修正后代码

[x,fs] = audioread("speech.au");    %读取音频
num = [1 2 4 7];    %调整为按比特数从小到大排列,对应码率升序
r = num*8;       %假设语音采样率为8kHz

PSNR = [];
for i = 1 : length(num)
    m_q = Uquant(x,2^num(i)); %均匀量化
    error = (m_q - x);   %误差信号E = m_q - x
    PY = 1/length(x) * sum(power(x,2)); %改用原始信号计算功率
    PE = 1/length(error) * sum(power(error,2));
    PSNR(i) = PY/PE;
end
dist = 1./ PSNR;
plot(r,dist,'-s');

xlabel("Bit Rate(Kbits/sec)");
ylabel("Distortion(1/PSNR)");
for i=1 : length(num)
    text(r(i)+1,dist(i)+.04,num2str(dist(i)));
end

function X = Uquant(X,N) %删除无效返回值N
d_x = double(X);
mx = max(d_x(:));
mi = min(d_x(:));
d0 = (mx - mi)/ (N-1);
z1 = round( (d_x-mi) ./ d0 );
X = z1 .* d0+mi; 
end

如果你的预期曲线纵轴是dB单位的失真,只需要把dist = 1./ PSNR;修改为dist = -10*log10(PSNR);即可匹配刻度趋势。

内容的提问来源于stack exchange,提问作者Joanna Hsieh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:27:04