Make(delphi) ver(4.04 build 185) Add(MainForm,10277700,21,154) { Width=292 Height=302 Caption="CompareSound_IC" Point(Handle) Point(onClose) link(onCreate,5806612:doEvent1,[]) } Add(BASS_Init,5107477,112,210) { Device=1 link(onInit,15564254:doEnum,[]) link(onError,16257771:doWork1,[(150,223)(150,247)(102,247)]) link(Handle,10277700:Handle,[(132,201)(27,201)]) } Add(Message,11967052,112,252) { } Add(BASS_RecordCenter,13190754,329,217) { link(onInit,3518566:doSetInput,[]) link(onError,16257771:doWork3,[(368,230)(368,304)(102,304)]) } Add(BASS_RecordStart,12408550,420,217) { Freq=44100 Mode=1 Name="MyStream" link(onData,2111790:doRecData,[(459,230)(459,237)]) } Add(BASS_RecordDevices,15564254,154,210) { link(onEnum,8599017:doValue,[]) } Add(BASS_InputControl,3518566,378,217) { Volume=1 State=1 link(onSetInput,12408550:doStart,[]) link(Index,13190754:CurDevice,[(384,208)(372,208)(372,255)(335,255)]) link(Volume,7519669:Var2,[]) link(State,7519669:Var3,[(398,208)]) } Add(MT_MultiMem,8599017,196,210) { Count=3 link(onData,14750053:doAdd,[]) } Add(InlineCode,2111790,476,217) { WorkPoints=#36:doStart=Установка начальных значений|25:doModel=Загрузка эталонов|35:doRecData=Потоковые звуковые данные|32:doWrithMolel=Сформировать эталон| EventPoints=#24:onSignal=Выход максимума|36:onColorMax=Цвет индикатора максимума|41:onWrithMolel=Вывод эталона для сохранения|36:onCompare=Вывод результата сравнения| VarPoints=# DataPoints=#35:CoeffSimilarity=Коэффициент подобия| Code=#15:unit HiAsmUnit;|0:|98:interface //K=(сумма(Xi-Xср)*(Yi-Yср))/Корень(сумма((Xi-Xср)^2)*сумма((Yi-Yср)^2))|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|87: ArraySound:Array[0..176] of real; //176--Среднее значение; 175--Сумма квадратов;|46: ArraySoundModelName:Array[0..4] of string;|74: ArraySoundModel:Array[0..4, 0..88] of real; //87--Сумма квадратов; |18: SumSound:real;|23: _SoundAverage:real;|36: Tick,NumSound,_NumModel:integer;|21: _FileName:string;|33: FileSequrity: file of byte; |9: public|25: _data_Data:THI_Event;|30: CoeffSimilarity:THI_Event;|67: onSignal:THI_Event; //Амплитуда звука|69: onWrithMolel:THI_Event; //Выход среднего|79: onCompare:THI_Event; //Выход результата сравнения |77: onColorMax:THI_Event; //Цвет индикатора максимума|74: onColor:THI_Event; //Цвет индикатора записи|51: procedure doStart(var _Data:TData; Index:word);|51: procedure doModel(var _Data:TData; Index:word);|53: procedure doRecData(var _Data:TData; Index:word);|82: procedure doWrithMolel(var _Data:TData; Index:word); //Сформировать эталон|4:end;|0:|14:implementation|0:|30:procedure THiAsmClass.doStart;|17: var i,j:integer;|6: begin|39: for i:=0 to 176 do ArraySound[i]:=0;|20: for i:=0 to 4 do |9: begin|32: ArraySoundModelName[i]:='';|47: for j:=0 to 88 do ArraySoundModel[i,j]:=0;|8: end;|19: _SoundAverage:=0;|14: SumSound:=0;|10: Tick:=0;|15: NumSound:=87;|15: _NumModel:=0;|5: end;|1: |30:procedure THiAsmClass.doModel;|17: var i,j:integer;|17: _Str:string;|6: begin|24: _Str:=ToString(_Data);|28: if _NumModel>4 then Exit;|50: ArraySoundModelName[_NumModel]:=Parse(_Str,';');|102: for i:=0 to 87 do ArraySoundModel[_NumModel,i]:=str2double(Parse(_Str,';')); //87--Сумма квадратов |25: _NumModel:=_NumModel+1;|5: end;|0:|32:procedure THiAsmClass.doRecData;|17: var St:PStream; |18: len:cardinal;|41: _Sound,_SoundMax,_SoundAbs:smallint;|53: _Smooth,_NoSmooth,Temp,KPirson,KPirsonMin:real; |30: i,j,k:integer; |6: begin|79: St := ReadStream(_data,_data_Data,nil); //Читаем звуковой поток ~0.1 сек.|71: if St = nil then Exit; //Выход, если нет данных.|98: KPirsonMin:=ReadReal(_data,CoeffSimilarity,0.8); //Минимальное значение коэффициента подобия|109: len := St.Size div 2; //Количество дискретных значений в потоке (1 канал по 2 байта).|21: _SoundMax:=0; |26: for i:=0 to len-1 do|12: begin|86: St.Read(_Sound,2); //Читаем по 2 байта в переменную _Sound|75: _SoundAbs:=abs(_Sound); //Детектируем звуковой сигнал|96: if _SoundAbs>_SoundMax then _SoundMax:=_SoundAbs; //Запоминаем максимум для вывода|98: _SoundAverage:=_SoundAverage*0.999 + _SoundAbs*0.001; //Вычисляем среднюю амплитуду звука|21: Tick:=Tick+1;|25: if Tick>100 then|15: begin|32: NumSound:=NumSound-1;|44: if NumSound<0 then NumSound:=86;|54: ArraySound[NumSound]:=round(_SoundAverage);|75: SumSound:=SumSound+ArraySound[NumSound]-ArraySound[NumSound+87];|57: ArraySound[NumSound+87]:=ArraySound[NumSound];|40: ArraySound[176]:=SumSound/87;|64: for k:=0 to _NumModel-1 do ArraySoundModel[k,88]:=0;|30: ArraySound[175]:=0;|29: for j:=0 to 86 do|18: begin|59: Temp:=ArraySound[NumSound+j]-ArraySound[176];|57: ArraySound[175]:=ArraySound[175]+sqr(Temp);|113: for k:=0 to _NumModel-1 do ArraySoundModel[k,88]:=ArraySoundModel[k,88]+Temp*ArraySoundModel[k,j];|17: end;|39: for k:=0 to _NumModel-1 do |18: begin|90: KPirson:= ArraySoundModel[k,88]/sqrt(ArraySound[175]*ArraySoundModel[k,87]);|41: if KPirson>KPirsonMin then|22: begin |103: _hi_OnEvent(onCompare, ArraySoundModelName[k]+';'+double2str(round(KPirson*1000)/10));|23: break;|20: end;|17: end;|19: Tick:=0;|14: end;|11: end;|38: _hi_onEvent(onSignal, _SoundMax);|85: if _SoundMax>31000 then //Определяем цвет индткатора:|101: _hi_OnEvent(onColorMax, 255) //красный, если уровень звука слишком большой|87: else _hi_OnEvent(onColorMax, 32768); //тёмнозелёный, если в норме. |12: |5: end;|1: |36: procedure THiAsmClass.doWrithMolel;|17: var i,j:integer;|15: Temp:real;|17: _Str:string;|6: begin|24: _Str:=ToString(_Data);|31: ArraySound[176]:=SumSound/87;|21: ArraySound[175]:=0;|20: for i:=0 to 86 do|9: begin|50: Temp:=ArraySound[NumSound+i]-ArraySound[176];|37: _Str:=_Str+';'+double2str(Temp);|48: ArraySound[175]:=ArraySound[175]+sqr(Temp);|8: end;|45: _Str:=_Str+';'+double2str(ArraySound[175]);|37: _hi_OnEvent(onWrithMolel, _Str); |5: end;|1: |4:end.| link(onSignal,4084247:doPosition,[]) link(onColorMax,4084247:doColor,[]) link(onCompare,658215:doValue,[(536,244)(536,258)]) link(CoeffSimilarity,4213335:Result,[]) } Add(ComboBox,14750053,245,210) { Left=10 Top=5 Width=190 Height=21 Point(doVisible) link(onClick,2616332:doEvent1,[]) link(Str,8599017:Value1,[(251,204)(234,204)(234,249)(202,249)]) } Add(Hub,2616332,287,217) { OutCount=3 link(onEvent1,13190754:doInit,[]) link(onEvent2,13836339:doData,[(312,230)(312,104)]) link(onEvent3,581140:doData,[(312,237)(312,272)(179,272)(179,258)]) } Add(DoData,581140,189,252) { Data=Integer(0) link(onEventData,14750053:doVisible,[]) } Add(ProgressBar,4084247,546,217) { Left=10 Top=8 Width=190 Height=5 Color=32768 Visible=1 Max=32768 ProgressColor=65280 Point(doColor) Point(doVisible) } Add(Memory,12640897,385,161) { Default=Integer(1) } Add(GetDataEx,7519669,385,203) { link(Data,12640897:Value,[]) } Add(HubEx,16257771,98,252) { link(onEvent,11967052:doMessage,[]) } Add(DoData,13836339,336,98) { Data=Integer(1) link(onEventData,15238272:doEvent1,[]) } Add(Hub,5806612,70,168) { OutCount=3 link(onEvent1,2111790:doStart,[(375,174)(375,181)(459,181)(459,223)]) link(onEvent2,7952809:doEnum,[(95,181)(95,139)]) link(onEvent3,5107477:doInit,[(95,188)(95,216)]) } Add(StrList,11369320,203,70) { FileName="MyAds.ini" AddType=1 Strings=#1015:СтукТ1;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;0;200;400;600;800;1000;1200;1400;1600;1800;2000;2000;1600;1200;800;400;0;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143|341:;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;-242.857142857143;28328571.4285715|1330:СтукТ2;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;0;200;400;600;800;1000;1200;1400;1600;1800;2000;2000;2000;2000;1600;1200;800;400;0;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;-308.823529411765;38685294.1176469|1238:СтукТМ;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;0;200;400;600;800;1000;1200;1400;1600;1800;2000;2000;2000;2000;2000;2000;1600;1200;800;400;0;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;-378.78787878788;49669696.9696971|1249:СтукМ1;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;0;200;400;600;800;1000;1200;1400;1600;1800;2000;2000;1800;1600;1400;1200;900;600;300;0;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;-310.44776119403;36317313.4328357|629:СтукМ2;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;0;200;400;600;800;1000;1200;1400;1600;1800;2000;2000;2000;2000;2000;1800;1600;1400;1200;900;600;300;0;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;-418.75;53082500| } Add(ArrayEnum,7952809,217,133) { link(onItem,2111790:doModel,[(256,139)(256,202)(466,202)(466,230)]) link(Array,11369320:Array,[]) } Add(ScrollBar,12475500,420,133) { Left=5 Top=30 Width=200 Height=10 Visible=1 Max=1000 Min=400 Position=800 Point(doVisible) link(onPosition,4213335:doOperation,[]) } Add(Label,8249149,630,133) { Left=210 Top=27 Caption="80 %" } Add(Math,4213335,476,133) { OpType=3 Op2=1000 Default=0.8 link(onResult,3850987:doOperation,[]) } Add(Math,3850987,546,133) { OpType=2 Op2=100 link(onResult,11883316:doStrCat,[]) } Add(StrCat,11883316,588,133) { Str2=" %" link(onStrCat,8249149:doText,[]) } Add(Label,2080112,546,91) { Left=65 Top=15 Width=90 Visible=1 Caption="Min coeff. similarity" Point(doVisible) } Add(Hub,15238272,378,98) { OutCount=3 link(onEvent1,2080112:doVisible,[]) link(onEvent2,4084247:doVisible,[(532,111)(532,237)]) link(onEvent3,12475500:doVisible,[(410,118)(410,146)]) } Add(StringTable,2945455,679,322) { Left=30 Top=50 Width=200 Height=205 Columns=#8:Время=60|9:Эталон=60|9:Коэфф.=50| Grid=0 Point(doEnsureVisible) } Add(Time,8304365,644,203) { Format="h:m:s" Point(DateTime) } Add(FormatStr,8112391,595,322) { Mask="%1;%2" link(onFString,12166556:doEvent1,[]) link(Str1,8304365:FormatTime,[(601,243)(650,243)]) link(Str2,658215:Value,[]) } Add(Hub,12166556,637,322) { link(onEvent1,2945455:doAdd,[]) link(onEvent2,2084588:doOperation,[(662,335)(662,370)(620,370)(620,391)]) } Add(Math,2084588,630,385) { OpType=1 Op2=1 ResultType=0 link(onResult,2945455:doEnsureVisible,[(669,391)(669,363)]) link(Op1,2945455:Count,[(636,376)(685,376)]) } Add(Math,4500585,651,252) { OpType=35 Op2=0.0000001 link(onResult,9808315:doData,[]) link(Op1,8304365:DateTime,[]) } Add(Memory,658215,602,252) { link(onData,4500585:doOperation,[]) } Add(ChangeMon,9808315,700,252) { link(onData,1595392:doEvent1,[]) } Add(InfoTip,12695183,168,42) { Info=#13:Эталоны стука| Width=99 Height=81 } Add(InfoTip,10929792,560,308) { Info=#22:Для проверки/настройки| Width=183 Height=116 } Add(Hub,1595392,749,252) { link(onEvent1,9938368:doPrint,[]) link(onEvent2,8112391:doString,[(774,265)(774,293)(585,293)(585,328)]) } Add(VisualText,9938368,784,252) { Lines=#25:Событие обнаружения стука| Width=116 Height=32 Point(doPrint) }