我写的程序从歌曲中去除人声使用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');
2条答案
按热度按时间yhived7q1#
从代码中我可以看出,如果频率内容在左右强度上“相等”(相等定义为比值在0.7和1.5之间),则可以简单地将其归类为人声。我不熟悉您使用此方案的原因,但它实际上可能会产生不错的结果。
你做错了什么最有可能与fft的大小和事实,你是处理完整的信号在一个去,可以这么说。
例如,一首歌曲中的人声会随着时间的推移而变化,因此你的掩蔽也会变化。这意味着你必须在时域中将信号分解成帧,并对每一帧分别进行FFT和掩蔽。同时,你应该考虑在时域帧中使用重叠。
问候
nkhmeac62#
也许这能帮到一些人