|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
小弟最近入门声学分析,用声级计采集了瞬时声压数据,自己按照振动分析的代码写了个程序,
贴出来供大家参考,一起讨论学习交流!
通过验证,与声级计分析出来的A计权总声压级在有的时间段差别很小0.5dB(A),有的时间段差别比较大,好几个dB(A),
希望大家一起完善!
- %A计权声压级频谱分析
- clc;
- clear;
- close all;
- %时域分析
- y=wavread('abc.wav');
- %频域分析
- fs=51200;%采样频率
- p0=2e-5;%参考声压
- f=[1.00 1.25 1.600 2.00 2.50 3.15 4.00 5.00 6.30 8.0]; %基准中心频率
- f1=[20.00 25.0 31.5 40.0 50.0 63.0 80];
- fc=[f1,100*f,1000*f,10000*f]; %%%%%%%%%中心频率%%%%%%%%
- %20-16000Hz A声级计权值
- cf=[-50.5,-44.7,-39.4,-34.6,-30.2,-26.2,-22.5,-19.1,-16.1,-13.4,-10.9,-8.6,-6.6,-4.8,-3.2,-1.9,-0.8,0,0.6,1.0,1.2,1.3,1.2,1.0,0.5,-0.1,-1.1,-2.5,-4.3,-6.6];
- x=y(t1*fs:t2*fs);%截取需要处理的数据段
- n=length(x);
- t=(0:1/fs:(n-1)/fs);
- subplot(221);
- plot(t,x);%瞬时声压时程图
- w=hanning(n); %汉宁窗
- xx=1.633*x.*w; %加汉宁窗(恢复系数为1.633)
- nfft=2^nextpow2(n);
- %nextpow2(n)-取最接近的较大2次幂
- a = fft(xx,nfft);
- f = fs/2*linspace(0,1,nfft/2);
- w=2*abs(a(1:nfft/2)/n);
- subplot(222);
- plot(f,w);%绘制频谱图
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %1/3倍频程计算
- oc6=2^(1/6);
- nc=length(cf);
- %下面这个求1/3倍频程的程序是按照振动振级计算那个来的
- for j=1:nc
- fl=fc(j)/oc6;
- fu=fc(j)*oc6;
- nl=round(fl*nfft/fs+1);
- nu=round(fu*nfft/fs+1);
- if fu>fs/2
- m=j-1;
- break;
- end
- b=zeros(1,nfft);
- b(nl:nu)=a(nl:nu);
- b(nfft-nu+1:nfft-nl+1)=a(nfft-nu+1:nfft-nl+1);
- c=ifft(b,nfft);
- yc(j)=sqrt(var(real(c(1:nnn))));
- end
- aj_sumn=0;
- for i=1:nc
- Lp1(i)=20*log10(yc(i)/p0);%未计权1/3倍频程声压级
- end
- %%%%%
- for jj=1:nc
- aj_sumn=aj_sumn+10^(0.1*Lp1(j));
- end
- Lp=10*log10(aj_sumn);%未计权总声压级
- subplot(223);%绘制未计权1/3倍频程声压级图谱
- bar(Lp1(1:nc));
- gg=zeros(1,nc);
- for i=1:nc
- gg(1:nc)=fc(1:nc);
- end
- ggg=1:nc;
- set(gca,'xtick',ggg);
- set(gca,'xticklabel',gg);
- %%%%%A计权1/3倍频程声压级
- Lap=Lp1+cf;
- aj_sum=0;
- for j=1:nc
- aj_sum=aj_sum+10^(0.1*Lap(j));
- end
- LA=10*log10(aj_sum);%Aa计权总声压级
- subplot(224);%绘制A计权1/3倍频程声压级图谱
- bar(Lp1(1:nc));
- gg=zeros(1,nc);
- for i=1:nc
- gg(1:nc)=fc(1:nc);
- end
- ggg=1:nc;
- set(gca,'xtick',ggg);
- set(gca,'xticklabel',gg);
复制代码
|
评分
-
1
查看全部评分
-
|