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
相关产品推荐
相关产品推荐

