【问题标题】:Noise cancellation with fft failing - unable to assign elementsfft 失败的噪声消除 - 无法分配元素
【发布时间】:2021-12-21 08:21:54
【问题描述】:

我有以下降噪代码:

[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)

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

由于左右两边的元素数量不同,无法进行赋值

task_one 中的错误(第 12 行) zproc_vec(k+1:k+256)=zproc;

【问题讨论】:

标签: matlab indexing fft


【解决方案1】:

我认为您的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

【讨论】:

  • 没问题,但不,我不能真正评论你的代码,这是你的代码不是我的!你应该debug你的代码,逐行遍历它,在文档中查找你不认识的函数,并编写对你有意义的 cmets
【解决方案2】:

''无法进行赋值,因为左右两边的元素数量不同''

您不理解错误消息的哪一部分?这意味着等号左边和右边的变量大小不同,所以你不能把右边的东西分配给左边的东西。

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

【讨论】:

  • 这充其量是关于 OP 可以在哪里找到答案或开始调试的指针,而不是实际答案。我会保留这个以供评论。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2016-06-13
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多