fft 失败的噪声消除 - 无法分配元素

Noise cancellation with fft failing - unable to assign elements

我有以下降噪代码:

[z,fs] = audioread('noisy_voices.wav'); % Use >>soundsc(z, fs) to hear the unprocessed signal
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)));
Z(zl-3: zl +3)=0;
Z(256-(zl-3:zl +3)+2)=0;
zproc = ifft(Z);
zproc = zproc+tail;
tail(1:128) = zproc(129:256);
zproc_vec(k+1:k+256)=zproc;
end
soundsc(zproc_vec , fs)

谁能告诉我为什么会出现此错误?

Unable to perform assignments because the left and right sides have a different number of elements

Error in task_one (line 12) zproc_vec(k+1:k+256)=zproc;

''Unable to perform assignments because the left and right sides have a different number of elements''

您不明白错误信息的哪一部分?这意味着等号左边和右边的变量有不同的大小,所以你不能把右边的东西赋值给左边的东西。

检查尺寸并确保它们相同。

我认为你的 Z = fft( ___ ) 行的输出将是一个列向量,但你将 tail 初始化为一个行向量 tail = zeros(1,256);

所以在这一行:

zproc = zproc+tail;

Implicit expansion 会使 zproc 成为一个 256*256 的正方形矩阵。

然后您的索引失败,如错误消息所述,因为您正试图将此方矩阵分配给您使用 zproc_vec(k+1:k+256) 索引的 256 个元素。

tail 初始化为列向量应该可以解决问题。

或者,您可以采取“懒惰”的方式,并确保您仅对列向量进行操作以创建 zproc

zproc = zproc(:)+tail(:); % Make both terms column vectors for addition