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
我有以下降噪代码:
[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