3

我编写了使用 fft 从歌曲中删除人声的程序。在 C# 之前,我决定在 Matlab 中测试降低频率的算法,但无法得到示例中的结果。有噪音。我试过选择任何范围(0.7 - 1.5),但都一样......噪音。我没有什么?请帮我写正确)提前谢谢!

[y, fs] = wavread('Song.wav');
left = y(:,1);
right = y(:,2);
fftL = fft(left);
fftR = fft(right);

for i = 1:683550 %in my example 683550
  dif = fftL(i,1) / fftR(i,1);
  dif = abs(dif);
  if (dif > 0.7 & dif < 1.5)
    fftL(i,1) = 0;
    fftR(i,1) = 0;
  end;
end;

leftOut = ifft(fftL);
rightOut = ifft(fftR);
yOut(:,1) = leftOut;
yOut(:,2) = rightOut;

wavwrite(yOut, fs, 'tmp.wav');
4

1 回答 1

1

从代码中我可以看到,如果左右之间的强度“相等”(相等被定义为 0.7 和 1.5 之间的比率),您只需将频率内容归类为人声。我不熟悉你这个计划的原因,但它实际上可能会产生一个不错的结果。

您做错了什么很可能与 fft 大小以及您一次性处理完整信号的事实有关,可以这么说。

例如,歌曲中的人声会随着时间而变化,因此您的掩蔽也必须变化。这意味着您必须在时域中将信号分解为帧,并为每个帧分别进行 fft 和屏蔽。此外,您应该考虑在时域框架中使用重叠。

问候

于 2013-01-22T15:45:44.463 回答