Matlab去除人声

piztneat  于 2023-01-05  发布在  Matlab
关注(0)|答案(2)|浏览(212)

我写的程序从歌曲中去除人声使用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');
yhived7q

yhived7q1#

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

nkhmeac6

nkhmeac62#

也许这能帮到一些人

[file, path] = uigetfile('*.wav','Select a .wav file');
if file == 0
    return
end

[y,Fs]= audioread(file);

if size(y,2) == 1
    msgbox('The selected file is Mono. This algorithm is applicable only for Stereo files.');
    return;
end

% fc=input('Enter Cutoff Frequency (HPF):');
% fc=round(fc);

fc = 3000;
if fc > 20
    fp = fc+5;
    fs = fc/(Fs/2);
    fp = fp/(Fs/2);
    [n wn] = buttord(fp,fs,0.5,80);
    [b, a] = butter(5,wn,'High');
    channel_2 = filtfilt(b,a,y(:,2));
else
    channel_2 = y(:,2);
end

background = y(:,1) - channel_2;

%Write it to a file
audiowrite([cd '\background.wav'],background,Fs);

相关问题