【问题标题】:Matlab removing vocalsMatlab去除人声
【发布时间】:2013-01-22 14:46:19
【问题描述】:

我编写了一个程序,使用 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');

【问题讨论】:

标签: matlab audio source-separation


【解决方案1】:

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

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

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

问候

【讨论】:

  • 除了以上所有要点之外,还需要Windowing 以最大限度地减少相邻强频率箱之间的流失。为了避免令人讨厌的瞬态拖尾,需要在时间和频率分辨率之间进行明显的权衡。上面的OP代码是这个的极端!理由是人声经常被平移到中心,而乐器更有可能被平移到另一侧。这不是一个特别可靠的假设,并且有很多程序材料不是这样的。
  • 非常酷。很想听听一个例子 :-) 如果您有时间,请随时将经过预处理和后处理的示例上传到 Youtube 或类似网站,并在此处发布链接。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2019-06-03
  • 2013-03-14
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多