基于FFT的噪声消除代码运行报错:无法完成元素赋值
报错原因排查
该报错是赋值语句左右两侧的元素维度/数量不匹配导致的,核心诱因有两个:
- 维度不匹配:Matlab中
hann(256)默认输出256×1的列向量,和同是列向量的音频切片相乘后,经过fft、ifft得到的zproc是列向量;但你初始化的zproc_vec是1×N的行向量,列向量无法直接赋值给行向量的切片区间,就会触发元素数目不一致的报错。 - 音频声道问题:如果输入音频是双声道,
audioread读取到的z是N×2的矩阵,切片后经过计算得到的zproc是256×2的矩阵,元素数量为512,和左侧256个元素的赋值区间完全不匹配。
修复方案
按以下修改调整代码即可解决问题,同时补充了索引越界防护逻辑:
[z,fs] = audioread('noisy_voices.wav'); z = mean(z,2); % 双声道转单声道,避免声道维度问题 zproc_vec=zeros(1,length(z)); tail = zeros(1,256); for k = 0:128:length(z)-256 Z = fft(z(k +1:k + 256).* hann(256)); [zmax, zl] = max(abs(Z(1:128))); % 新增边界判断,避免峰值在区间两端时索引越界 low = max(1, zl-3); high = min(128, zl+3); Z(low: high)=0; Z(256-(low:high)+2)=0; zproc = real(ifft(Z)); % 取实部,避免计算残留虚数干扰 zproc = zproc+tail.'; % tail转列向量后再相加,匹配维度 tail(1:128) = zproc(129:256).'; % 计算结果转行向量再赋值给tail zproc_vec(k+1:k+256)=zproc.'; % 列向量转行向量后再赋值 end soundsc(zproc_vec , fs)
如果需要处理音频末尾不足256采样点的部分,可以在读取音频后对z做末尾补零,补到长度为128的整数倍加256即可。
内容的提问来源于stack exchange,提问作者Banturam
相关产品推荐
相关产品推荐

