我正在尝试在matlab中对wav文件进行频谱分析,但我对数字信号处理知之甚少。
我遇到的问题是从fft函数中获得正确的dB级别,并且无法从以前的帖子中找到正确的答案
以下是我的代码:
% spectre from wav
clear all
close all
[sig, fs]=audioread('BKSinus1000Hz.wav')
S=1.51; %sensitivity of microphone mV/Pa
sig1=1.51*sig(:,1);
N=length(sig1);
t=linspace(0,N/fs,N);
figure(101)
plot(t,sig1)
Nfft=1024;
f=linspace(0,fs,Nfft);
A1=abs(fft(sig1,Nfft));
figure(102)
axes('units','centimeters','position',[1. 1. 18. 12.]);
hold on; box on;
set(gca,'xlim',[0 1*1E4])
semilogx(f(1:Nfft/2),20*log10(A1(1:Nfft/2)/(2E-5)))
sig2=sig1.*hanning(N);
figure(201)
plot(t,sig2)
A2=abs(fft(sig2,Nfft));
figure(202)
axes('units','centimeters','position',[1. 1. 18. 12.]);
hold on; box on;
set(gca,'xlim',[100 1*1E4],'xtick',[800 2E3 1E4])
semilogx(f(1:Nfft/2),20*log10(A2(1:Nfft/2)/(2E-5)))
我试图使用Hanning窗口,我认为我遇到了fft大小的问题:matlab似乎只使用wav文件的Nfft-First样本(而不是整个文件)来计算fft ,所以水平是错误的。
所以我有两个问题:选择合适大小的fft的规则是什么(不知道文件的频率内容)。以及如何将wav样本值转换为dB?