==========================================================
# 各步骤解释
[x,fs] = audioread('1Krecordingwav'); %替换成其他录音
L = length(x);
y=fft(x); # 注意:没有做归一化处理
f =fs/2.*linspace(0,1,L/2+1);
y = y(1:L/2+1);
plot(f,abs(y),'b'); % 读取wav中的信息,并做FFT变换。 检查是否只有1K,以及1K的幅度(0.15),最大频率。
% 到此时,只有1K,幅度为0.15, 最大频率2万五。
A= filterA(f);
yweighted = A'.*y; %得到加权后的complex Amplitude
plot(f,abs(yweighted),'r'); % 这个时候一切正常,仍然只有1K,1K的幅度为0.15,最大两万五
%然后准备ifft变换
xweighted = ifft(yweighted); %得到和yweighted 相同长度的xweighted # 注意:没有做归一化处理
xweighted = real(xweighted); % 处理后的xweighted不在是一个实数序列,只取其实部
%检验一下xweighted的内容
tempdata = xweighted;
tempL = length(tempdata);
temp1 = fft(tempdata)/tempL*2;
plot(f,abs(temp1),'g');
% 这个时候也没有问题,注意的是temp1的运算,不再需要除以L再乘以2.因为你已经在实际幅度上运算了。
% 也许前面不需要做归一化,归一化应该放到最后面。%
# x, xweighted 分别代表了无计权的原始数据和A计权处理后的数据。
#下一步根据数据去推声压,
#这一部分是求A计权声压
linelevel =1.8;
preampout = abs(xweighted.*1.8);
preampin = preampout;
pressure = 1000.*preampin./22.78;
pref = 0.00002;
pressure = sqrt(mean(pressure.^2));
AweightedSPL =20.*log10(pressure/pref);
#这一部分是求无计权声压
pshorttime = abs(x.*1.8);
pressureshorttime = 1000.*pshorttime./22.78;
pressureshorttime = sqrt(mean(pressureshorttime.^2));
SPL =20.*log10(pressureshorttime/pref);
#返回无计权和A计权两种声压值
SPL
AweightedSPL