读取音频数据
[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
我想我再清楚不过了