科研_两种麦克风_校正
目的
校正麦克风,得到1pa声强下对应两种麦克风G.R.A.S和Dodo的电压值。
作为基准,并根据公式,将后续待测实际实验(npa)下测得的电压值转化成声压级SPL(db)。
理论支持
Pa-db 转换公式
SPL(db) = 20log10(P / Pref) 公式1
SPL单位db,从量纲来看,应该为0?
其中 P 为动态声压的均方值差,直观感觉动态值变恒定值,等于其幅值的0.707倍。
Pref 基准值
e.g. 线性尺度
pref = 1pa/ 1pa对应0db 0.001pa 对应 -60db
分贝尺度
pref = 2e-5pa/ 1pa对应94db 10pa对应114db
为什么要转换?声压级
从听阈到痛阈(2e-5, 20pa/ 0, 120db),声压的绝对值相差1000000倍。显然,用声压的绝对值表示声音的大小是不方便的。
为了便于应用,人们便根据人耳对声音强弱变化响应的特性,引出一个对数量来表示声音的大小,这就是声压级。
后续分析,需用到声压级。
Pa
所得声音数据为电压 Vr,实则表示声压 P,因此两者间对应关系应明确 1 / Vb,麦克风校正解释如下。
麦克风校正
获得常用声压对应的电压值 Vb。
传声器校准时,常用声压有效值分别是1Pa和10Pa。
1 / Vb
P / Vr = 1 / Vb 公式2
Pref
采用分贝尺度,Pref = 2e-5
最终公式
将公式2,Pref代入公式1,可得 SPL(db) = 20log10(Vr / Vb) + 94
麦克风校正步骤
G.R.A.S
将八个G.R.A.S依次插入到声波矫正器 (94/114db) 孔中, 打开矫正器电源,默认发出声波为94db。
运行CorectGRAS.m,收集G.R.A.S的声音数据。
运行ComputeRMS.m,计算每个G.R.A.S电压的有效值。
重复上述操作三次。
若各G.R.A.S的三次RMS值相对误差在 5%之内,则取平均值作为麦克风的1pa下的电压基准。
否则,删除波动较大数据,重复前三次操作测新的数据,继续判断是否符合,直至数据可用。
Dodo
如何用matlab控制loudspeaker发出在接受位置处特定声压的声波。
涉及程序
CorectGRAS.m
%% Correction of GRAS Microphones % Note: in this case, Run the program "StartUp.m" % Author: unknown professor % Verified by yanming on Nov, 17, 2018 clear all; % Pramters fs = 250e3; duration = 3; n_mic = 8; GRAS_data = zeros(fs, n_mic); % GRAS microphone for MICpnt = 1:n_mic disp(['MIC number = ' num2str(MICpnt)]); aa = input('Push key 1 to start: '); % start the session s=daq.createSession('ni'); ch1=s.addAnalogInputChannel('Dev4',0:7,'Voltage'); ch2=s.addAnalogInputChannel('PXI2Slot2',0:15,'Voltage'); % setting the input range for m = 1:8 ch1(m).Range = [-5 5 ]; end for m=1:16 ch2(m).Range = [-5 5 ]; end % analog output for trigger of the camera % s.addAnalogOutputChannel('PXI2Slot2',1, 'Voltage'); % outdata=zeros(fs*duration,1); % outdata(1:round(fs))=4.8; % s.queueOutputData(outdata); % if you do not use the analog output, please use the following equation: s.DurationInSeconds = duration; % addDigitalChannel(s,'PXI2Slot2','Port0/Line0','OutputOnly'); % sampling frequency s.Rate=fs; % common trigger to synchronize the system % addTriggerConnection(s,'PXI2Slot2/PXI_Trig0','Dev4/PXI_Trig0','StartTrigger'); % get all MICs data c = clock; disp('Measuring Started'); data = s.startForeground; % disp('Measuring Stopped'); cname = datestr(c,'yymmddHHMMSS'); savename = ['output' filesep 'data' cname '.mat']; save(savename,'data'); max_data = max(max(abs(data))); % get the G.R.A.S data % micphone loction: PXI2SLOT 0-7 GRAS_data(:,MICpnt) = data(:,MICpnt+8); savename = ['output' filesep 'GRAS_data' cname '.mat']; save(savename,'GRAS_data'); % plot all data for m=1:6 for n=1:4 subplot(6,4,(m-1)*4+n); plot((1:length(data))/fs,data(:,(m-1)*4+n)); ylim([-max_data max_data]); title(num2str((m-1)*4+n)); end end disp('Process finished'); end
ComputeRMS.m
% Voltage Root-Mean-Square(RMS) of G.R.A.S Microphone at 1Pa % Author: unknown professor % Verified by yanming on Nov, 17, 2018 clear all; % load data interactively [FileName,PathName] = uigetfile('*.mat','cd'); load([PathName FileName]); % prameters and output fs = 250e3; n_mic = size(GRAS_data,2); fil_data = zeros(fs, n_mic); RMS = zeros(1, n_mic); output = 'RMS_GRAS_Voltage.mat'; % plot filtered G.R.A.S microphone data for m = 1:n_mic fil_data(:,m)=filtfilt(fil,1,GRAS_data(:,m)); plot ((1:length(fil_data))/fs,fil_data(:,m)+m); hold on; end % get the axis value of analyzed data aa = input('press number key after adjust the data region '); ax = axis*fs; for m=1:n_mic % calculte the valid value of selected areas RMS(m)=sqrt(mean(fil_data(round(ax(1)):round(ax(2)),m).^2)); end save(output, 'RMS');
参考
https://zhuanlan.zhihu.com/p/26525950
http://www.ni.com/white-paper/14349/en/