将音频信号划分为 Barks Band

信息处理 fft 功率谱密度 语音处理 指纹识别
2022-01-30 21:06:25

我想在matlab中应用以下步骤

1) 读取音频数据

2)对该数据应用窗口函数

3)对窗口函数的结果应用fft

4)制作fft的功率谱

5) 将功率谱划分为 Barks 频带

[y,Fs,bits] = wavread('file1.wav');
Nsamps = length(y); 
ham= hamming(Nsamps);
ham_fft = abs(fft(ham));
ham_fft = ham_fft(1:Nsamps/2);      %Discard Half of Points
plot(f, ham_fft)
xlim([0 1000])  
xlabel('Frequency (Hz)')
ylabel('Amplitude')
title('FFT of Hamming Window of  a an audio');

我没有得到正确的波形,想绘制频谱,然后分成树皮带。

1个回答
  • 读取音频数据

    [y,Fs,bits] = wavread('file1.wav');
    
  • 对该数据应用窗口函数

    ham=hamming(Nsamps);
    windowed = y .* ham;
    
  • 对窗口函数的结果应用 fft

    ham_fft = fft(windowed);
    ham_fft = ham_fft(1:Nsamps/2);      %Discard Half of Points
    
  • 制作fft的功率谱

    PowSpec = abs(fft(ham_fft)).^2;
    
  • 在 Barks 频带中划分功率谱

所以这里可能会开始一些有趣的事情,根据维基百科,赫兹的 24 个关键树皮乐队是:

20,100,200,300,400,510,630,770,920,1080,1270,1480,1720,2000,2320,2700,3150,3700,4400,5300 6400,7700,9500,12000,15500

现在要在 Barks 频带中拆分功率谱,您需要执行以下操作:

BandBarks = [20 100 200 300 400 510 630 770 920 1080 1270 1480 1720 2000 2320 2700 3150 3700 4400 5300 6400 7700 9500 12000 15500];


for l = 1:length(BandBarks)-1 
    CurrentBand = [BandBarks(l):BandBarks(l+1)];
    PowSpec(CurrentBand,:) %% here is the power spectrum for each Barks bands
end 

好的,您评论的错误似乎您的音频是立体声,转换为单声道,或者只获得一个频道!

我上面的示例假设每个 BIN 编号都是等效频率(当然这并不常见,只是一个示例),要找到您需要计算的频率是什么 bin:

BandBarks(Fslength(FFT))

所以基于这个等式:

Bins = zeros(length(BandBarks),1);
for j = 1:length(BandBarks)

    Bins(j)=round(BandBarks(j)/(Fs/length(FFT)))

end

现在在这里如何单独绘制每个树皮带:

for l = 1:length(Bins)-1 
    CurrentBand = [Bins(l):Bins(l+1)];
    figure(l);
    plot(PowSpec(CurrentBand,:));
end 

我想我再清楚不过了