📄 voicelevelgui.m
字号:
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 + -