资源简介
自己编写的在时域频域声压级计算,并且fft的处理,
代码片段和文件信息
clear all; clc;
file1 = ‘校准94dB.wav‘; % 94dB校准信号; 48kHz
file2 = ‘校准114dB.wav‘; % 114dB校准信号 48kHz
file3 = ‘2_70s.wav‘; % 待处理文件
Fs = 8000; % Hz 在8kHz采样率范围内计算声压级
data1 = wavread(file1); data1 = detrend(data1(:1)0); % 读wav文件并去均值
data2 = wavread(file2); data2 = detrend(data2(:1)0);
data3 = wavread(file3); data3 = detrend(data3(:1)0);
% 降采样到8kHz
data1 = resample(data1848);
data2 = resample(data2848);
data3 = resample(data3848);
% 验证:标校信号应该相差114-94=20dB = check1
% a1 = rms(data1);
% a2 = rms(data2);
% check1 = 20*log10(a2/a1);
nfft = 512; % FFT长度
% ---- 处理94dB标校信号,得到比较参数 ----
% 时域比较参数
a1 = rms(data1);
% 频域比较参数
% 对标校信号分帧求频谱在1Khz处的值
nfrm1 = fix(length(data1) / nfft); % 数据可分为nfrm帧,此处nfft即作为每帧的数据长度
for i = 1:nfrm1
sp1 = abs(fft(data1((i-1)*nfft+1:i*nfft).*hanning(nfft) nfft));
sp1 = sp1(1:nfft/2);
sp1_mv(i) = max(sp1); % 获得每帧信号频谱的最大值,由于是1kHz校准信号,最大值肯定在1kHz处
end
sp1_1k = mean(sp1_mv); % 理论上,如果校准信号稳定,所有帧在1khz处的频谱值应该是相等的。如果不稳定,则不能用求均值的方法。
n = 5; % 1s内需要多少个计算结果
len = length(data3);
len_frm = Fs / n; % 0.2s数据为一帧
nfrm = fix(len / len_frm);
for i = 1:nfrm
datafrm = detrend(data3((i-1
评论
共有 条评论