在 3 个不同的频率区域中分离音频文件

Posted

技术标签:

【中文标题】在 3 个不同的频率区域中分离音频文件【英文标题】:Separating audio file in 3 different frequency areas 【发布时间】:2016-11-26 20:12:43 【问题描述】:

如果标题令人困惑,我提前道歉。基本上,我有一个音频文件,我每 50 毫秒执行一次 STFT。我的文件长约 11 秒(10.8526 秒),我已将其从原声带中截断。顺便说一句,我不允许将 Matlab 中的内置函数用于 STFT。我知道这要容易得多。无论如何,在我运行我的代码后,每 50 毫秒执行一次 STFT,并且正在绘制图片。 现在我想把它分成 3 个不同的地块。在第一个图中我有较低的频率(0-300Hz),在第二个图中我有中频(300-5kHz),在最后一个图中我有高频(5Khz-fs/2)。 fs=44100 --> 下面的代码中有进一步的解释。我现在如何定义这些区域?

%AUDIO-FILE
%______________________________________________________
[y,fs]=audioread('UnchainMyHeart.wav');
% audioread = Reads Audio file
% y = A vector, which contains the audio signal
% fs = sample rate
% 'UnchainMyHeart' = Audio file
%______________________________________________________


% Paramter for the real-time spectral-analysis
%______________________________________________________
 NFA=2; 
% Every second picture is being plotted
% Don't need every picture
 t_seg=0.05; 
%Length of the audio signal on which is a STFT performed 

fftlen = 4096; 
% Length of the FFT, frequency resolution

 TPF= 300;
 BPF= 5000;
 HPF= 22050;
% Trying to define the frequencies areas
% Isn't working right now

 LOW=((TPF*fftlen)/fs);
 MEDIUM=((BPF*fftlen)/fs);
 HIGH=((HPF*fftlen)/fs);
% Contains the number of FFT points in the frequency 
%_______________________________________________________

 segl =floor(t_seg*fs); 

 windowshift=segl/2; 

 window=hann(segl); 

 window=window.'; 

 si=1; 
% Start Index

 ei=segl; 
% End Index

 AOS= length(y)/windowshift - 1;

 f1=figure;

f=0:1:fftlen-1;
f=f/(fftlen-1)*fs;

Ya=zeros(1,fftlen);

n=0;

for m= 1:1:AOS

y_a = y(si:ei);
y_a= y_a.*window;
Ya=fft(y_a, fftlen);

n=n+1;
if n==1
  Yres=abs(Ya);
  else
  Yres=Yres+abs(Ya);
end

if n==NFA
  Yres=Yres/NFA;
  n=0;

  drawnow; 
  %Updates the graphical objects which are being plotted every 50ms

figure(f1);
plot(f(1:end/2), 20*log10(abs(Yres(1:end/2))));

ylim([-90 50]);
title('Spektrum of audio signal');
xlabel('f(Hz)');
ylabel('dB');
grid on;

end

si=si+windowshift; 
% Updating Start Index    
ei=ei+windowshift; 
% Updating End index

end

【问题讨论】:

【参考方案1】:

由于我没有你的音频文件,我无法运行你的代码,但我会尝试从概念上解释,并使用伪代码。

频率砖墙

如果您只是为了视觉目的而想要分离频率,您可以使用砖墙过滤器。

对完整信号执行fft。定义一个频率向量。

SigFD = fft(signal);
n = length(signal); % number of samples
fs = 44100; % sampling rate
deltaF = fs/n; % frequency resolution
F = [0:floor(n/2)-1, -(floor(n/2)):-1]*deltaF; % frequency vector

根据您想要的频率范围对信号进行切片。

lowF = 0;
highF = 500;
part1Range = abs(F)>lowF&abs(F)<highF;
Fpart1 = F(part1Range);
Sig1FD = SigFD(part1Range);

请注意,我无法在您的波形上测试代码,因此这应该被视为更多的伪代码!

【讨论】:

以上是关于在 3 个不同的频率区域中分离音频文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个不同频率的音调混合为一个

傅立叶变换大量音频文件?

读取音频 wav 文件并绘制在 python 中平滑的音频频率响应

什么软件可以创作声音,主要可以定义声音的频率,连续播放

iPhone - 从视频文件中分离音频并将其保存到单独的文件中

根据频率创建音频文件