⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voicelevelgui.m

📁 matlab数据采集工具箱应用示例。gui是在matlab7.0.1下设计
💻 M
📖 第 1 页 / 共 3 页
字号:
end
htimer = timerfind('tag','showtime');
stop(htimer);
delete(htimer);
try
    if isvalid(handles.ai)
        if strcmp(get(handles.ai, 'Running'), 'On')
            stop(handles.ai);
        end
        delete(handles.ai);
    end
catch
    
end

delete(handles.voiceLevelGUI);




%% ************************************************************************
function localfftShowData(obj, event, handles)
%%
% Get the handles of those objects.
haxes1 = handles.axes1;
haxes2 = handles.axes2;
hLine1 = handles.line1;
hLine2 = handles.line2;

% 倍程频相关对象
hBand1edit = handles.editL1;
hBand2edit = handles.editL2;
hBand3edit = handles.editL3;
hBand4edit = handles.editL4;
hBand5edit = handles.editL5;
hBand1axes = handles.axesL1;
hBand2axes = handles.axesL2;
hBand3axes = handles.axesL3;
hBand4axes = handles.axesL4;
hBand5axes = handles.axesL5;
hBand1patch = handles.patchL1;
hBand2patch = handles.patchL2;
hBand3patch = handles.patchL3;
hBand4patch = handles.patchL4;
hBand5patch = handles.patchL5;

% 1/3倍程频相关对象
hBand21edit = handles.editLL1;
hBand22edit = handles.editLL2;
hBand23edit = handles.editLL3;
hBand24edit = handles.editLL4;
hBand25edit = handles.editLL5;
hBand21axes = handles.axesLL1;
hBand22axes = handles.axesLL2;
hBand23axes = handles.axesLL3;
hBand24axes = handles.axesLL4;
hBand25axes = handles.axesLL5;
hBand21patch = handles.patchLL1;
hBand22patch = handles.patchLL2;
hBand23patch = handles.patchLL3;
hBand24patch = handles.patchLL4;
hBand25patch = handles.patchLL5;


set(hLine1,'visible','on');
set(hLine2,'visible','on');
%%
% Obtain the available time and data.
blockSize = get(obj,'SamplesPerTrigger');
x = peekdata(obj,blockSize);
%%
% FFT calculation.
Fs = obj.SampleRate;
[firstcross, lastcross] = localDaqCrossPt(x);
fftx = x(firstcross:lastcross);
blockSize = length(fftx);
[f,mag] = localDaqfft(fftx,Fs,blockSize);


%%
% Dynamically modify Analog axis as we go.
maxX=max(x);
minX=min(x);
yax1=get(haxes1,'YLim');
if minX<yax1(1),
    yax1(1)=minX;
end
if maxX>yax1(2),
    yax1(2)=maxX;
end
set(haxes1,'YLim',yax1,'XLim',[0 length(x)]);
%%
% Dynamically modify Frequency axis as we go.
maxF=max(f);
minF=min(f);
xax=get(haxes2,'XLim');
if minF<xax(1),
    xax(1)=minF;
end
if maxF>xax(2),
    xax(2)=floor(maxF/2);
end
set(haxes2,'XLim',xax);
%%
% Dynamically modify Magnitude axis as we go.
maxM=max(mag);
minM=min(mag);
yax2=get(haxes2,'YLim');
if minM<yax2(1),
    yax2(1)=minM;
end
if maxM>yax2(2),
    yax2(2)=maxM;
end
set(haxes2,'YLim',yax2);

%% 更新左边的轴上曲线
set(hLine1, 'YData', x(:,1),'XData',1:length(x));
fHalf = f(1:floor(end/2),:); magHalf = mag(1:floor(end/2),:);
set(hLine2, 'XData', fHalf(:,1), 'YData', magHalf(:,1));

%%
% 计算倍频程
index1 = (f>22.5&f<45);
if sum(index1) >0
    band1val = mean(mag(index1));
else
    band1val = 0;   % 没有该频率段的值
end
index2 = (f>45&f<90);
if sum(index2) >0
    band2val = mean(mag(index2));
else
    band2val = 0;   % 没有该频率段的值
end
index3 = (f>90&f<180);
if sum(index3) >0
    band3val = mean(mag(index3));
else
    band3val = 0;   % 没有该频率段的值
end
index4 = (f>180&f<354);
if sum(index4) >0
    band4val = mean(mag(index4));
else
    band4val = 0;   % 没有该频率段的值
end
index5 = (f>354&f<707);
if sum(index5) >0
    band5val = mean(mag(index5));
else
    band5val = 0;   % 没有该频率段的值
end

% 计算1/3倍频程
index1 = (f>44.5&f<56); % 50
if sum(index1) >0
    band21val = mean(mag(index1));
else
    band21val = 0;   % 没有该频率段的值
end
index2 = (f>89&f<112); % 100
if sum(index2) >0
    band22val = mean(mag(index2));
else
    band22val = 0;   % 没有该频率段的值
end
index3 = (f>178&f<224); % 200
if sum(index3) >0
    band23val = mean(mag(index3));
else
    band23val = 0;   % 没有该频率段的值
end
index4 = (f>356&f<448); % 400
if sum(index4) >0
    band24val = mean(mag(index4));
else
    band24val = 0;   % 没有该频率段的值
end
index5 = (f>712&f<896); % 800
if sum(index5) >0
    band25val = mean(mag(index5));
else
    band25val = 0;   % 没有该频率段的值
end

%%
% 计算A声级
deletaI = [-70.4 -63.4 -56.7 -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];
ffI = [10 12.5 16 20 25 31.5 40 50 63 80 100 125 160 200 250 315 400 500,...
    630 800 1000 1250  1600 2000 2500];
sumTmp = 0;
for k = 1:length(ffI)
    indx = f>(ffI(k)-0.5)&f<(ffI(k)+0.5);  % 查找频率为给定的那25个值的序号
    % 容许偏差为0.5,个人认为你在这里的理解有问题,如果按照你的意思,此处直接
    % 用f ==ffI(k),估计计算出来的值基本上都是0;我这样处理也应该不对的,
    Lpi = mag(indx);
    sumTmp = sumTmp+ 10.^((sum(Lpi)+deletaI(k))/10);
end
if abs(sumTmp) <1e-9 % 避免为sumTmp为0的情况
    sumTmp = 1e-9;
end
La = 10*log10(sumTmp);
set(handles.editALevel,'string',num2str(La,6));

% 保存La数据于UserData,供导出时用
LaData = get(handles.editALevel,'UserData');
LaData = [LaData;La];
set(handles.editALevel,'UserData',LaData);

% 保存倍频程数据于appdata供导出时用
BandData = getappdata(handles.voiceLevelGUI,'BandData');
tmpData = [band1val,band2val,band3val,band4val,band5val];
BandData = [BandData;tmpData];
setappdata(handles.voiceLevelGUI,'BandData',BandData);
% 保存1/3倍频程数据于appdata供导出时用
Band2Data = getappdata(handles.voiceLevelGUI,'Band2Data');
tmpData = [band21val,band22val,band23val,band24val,band25val];
Band2Data = [Band2Data;tmpData];
setappdata(handles.voiceLevelGUI,'Band2Data',Band2Data);


%%
% 动态更新倍频程显示的坐标
yax3 = get(hBand1axes,'YLim');
upYlim = max([band1val,band2val,band3val,band4val,band5val]);
lowYlim = min([band1val,band2val,band3val,band4val,band5val]);
if upYlim > yax3(end)
    yax3(end) = yax3(end)+10;
end
if lowYlim <  yax3(1)
     yax3(1) = yax3(1)-10;
end
set(hBand1axes,'Ylim',yax3);
set(hBand2axes,'Ylim',yax3);
set(hBand3axes,'Ylim',yax3);
set(hBand4axes,'Ylim',yax3);
set(hBand5axes,'Ylim',yax3);

 %%
% Update the plots.
low = yax3(1);
set(hBand1edit,'string',num2str(band1val,4));
set(hBand2edit,'string',num2str(band2val,4));
set(hBand3edit,'string',num2str(band3val,4));
set(hBand4edit,'string',num2str(band4val,4));
set(hBand5edit,'string',num2str(band5val,4));

set(hBand1patch,'YData',[low low band1val band1val]);
set(hBand2patch,'YData',[low low band2val band2val]);
set(hBand3patch,'YData',[low low band3val band3val]);
set(hBand4patch,'YData',[low low band4val band4val]);
set(hBand5patch,'YData',[low low band5val band5val]);

%%
% 动态更新1/3倍频程显示的坐标
yax23 = get(hBand21axes,'YLim');
upYlim2 = max([band21val,band22val,band23val,band24val,band25val]);
lowYlim2 = min([band21val,band22val,band23val,band24val,band25val]);
if upYlim2 > yax23(end)
    yax23(end) = yax3(end)+10;
end
if lowYlim2 <  yax23(1)
     yax23(1) = yax23(1)-10;
end
set(hBand21axes,'Ylim',yax23);
set(hBand22axes,'Ylim',yax23);
set(hBand23axes,'Ylim',yax23);
set(hBand24axes,'Ylim',yax23);
set(hBand25axes,'Ylim',yax23);

 %%
% Update the plots.
low2 = yax23(1);
set(hBand21edit,'string',num2str(band21val,4));
set(hBand22edit,'string',num2str(band22val,4));
set(hBand23edit,'string',num2str(band23val,4));
set(hBand24edit,'string',num2str(band24val,4));
set(hBand25edit,'string',num2str(band25val,4));

set(hBand21patch,'YData',[low2 low2 band21val band21val]);
set(hBand22patch,'YData',[low2 low2 band22val band22val]);
set(hBand23patch,'YData',[low2 low2 band23val band23val]);
set(hBand24patch,'YData',[low2 low2 band24val band24val]);
set(hBand25patch,'YData',[low2 low2 band25val band25val]);

drawnow;




%%  ***********************************************************************
function [firstcross, lastcross] = localDaqCrossPt(data)
% Calculate the first & last crosspoints over the mean of the data.
% function returns 0 if no crosspoint is found.
firstcross = 0;
crossvalue = mean(data);
for i = 2:length(data)
    if(data(i-1) >= crossvalue & data(i) < crossvalue)
        firstcross = i;
        break;
    end
end

lastcross = 0;
for i = length(data):-1:2
    if(data(i-1) >= crossvalue & data(i) < crossvalue)
        lastcross = i;
        break;
    end
end




%% ***********************************************************************  
% Calculate the fft of the data.
function [f, mag] = localDaqfft(data,Fs,blockSize)
%%
% Calculate the fft of the data.
xFFT = fft(data);
xfft = abs(xFFT);
%%
% Avoid taking the log of 0.
index = find(xfft == 0);
xfft(index) = 1e-17;

mag = 20*log10(xfft);
mag = mag(1:floor(blockSize/2));

f = (0:length(mag)-1)*Fs/blockSize;
f = f(:);

% 理解错误,原来SamplesAcquiredFcn只执行一次
% function saveData(obj,event,handles)
% data = getdata(obj);
% allData = get(handles.btnExport,'UserData');
% allData = [allData;data];
% set(handles.btnExport,'UserData');
% 






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -