• 科研_两种麦克风_校正


    目的

      校正麦克风,得到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/

  • 相关阅读:
    User类 新增共有属性Current ID
    关于multi-label classification中评价指标的一些理解
    Improved Few-Shot Visual Classification草草阅读
    文献阅读:A New Meta-Baseline for Few-Shot Learning
    Windows 10系统在Anaconda下安装GPU版Pytorch
    第九章实验
    实验 5 编写、调试具有多个段的
    实验 4 [bx]和loop的使用
    实验三
    实验 2 用机器指令和汇编指令编程
  • 原文地址:https://www.cnblogs.com/dignity/p/10023663.html
Copyright © 2020-2023  润新知