|
@@ -4076,6 +4076,35 @@ cmRC_t cmVectArrayWriteMatrixS( cmCtx* ctx, const char* fn, const cmSample_t* m,
|
4076
|
4076
|
|
4077
|
4077
|
}
|
4078
|
4078
|
|
|
4079
|
+cmRC_t cmVectArrayWriteMatrixR( cmCtx* ctx, const char* fn, const cmReal_t* m, unsigned rn, unsigned cn )
|
|
4080
|
+{
|
|
4081
|
+ cmRC_t rc = cmOkRC;
|
|
4082
|
+ cmVectArray_t* p;
|
|
4083
|
+ unsigned i;
|
|
4084
|
+
|
|
4085
|
+ if((p = cmVectArrayAlloc(ctx,kRealVaFl)) == NULL )
|
|
4086
|
+ return cmCtxRtCondition(&ctx->obj,cmSubSysFailRC,"Unable to allocate an cmVectArray_t in cmVectArrayWriteVectorR().");
|
|
4087
|
+
|
|
4088
|
+ for(i=0; i<cn; ++i)
|
|
4089
|
+ {
|
|
4090
|
+ if((rc = cmVectArrayAppendR(p,m + (i*rn), rn)) != cmOkRC )
|
|
4091
|
+ {
|
|
4092
|
+ rc = cmCtxRtCondition(&p->obj,rc,"Vector append failed in cmVectArrayWriteVectorR().");
|
|
4093
|
+ goto errLabel;
|
|
4094
|
+ }
|
|
4095
|
+
|
|
4096
|
+ }
|
|
4097
|
+
|
|
4098
|
+ if((rc = cmVectArrayWrite(p,fn)) != cmOkRC )
|
|
4099
|
+ rc = cmCtxRtCondition(&p->obj,rc,"Vector array write failed in cmVectArrayWriteVectorR().");
|
|
4100
|
+
|
|
4101
|
+ errLabel:
|
|
4102
|
+ if((rc = cmVectArrayFree(&p)) != cmOkRC )
|
|
4103
|
+ rc = cmCtxRtCondition(&ctx->obj,rc,"Free failed on cmVectArrayFree() in cmVectArrayWriteVectorR().");
|
|
4104
|
+
|
|
4105
|
+ return rc;
|
|
4106
|
+
|
|
4107
|
+}
|
4079
|
4108
|
|
4080
|
4109
|
cmRC_t cmVectArrayWriteVectorI( cmCtx* ctx, const char* fn, const int* v, unsigned vn )
|
4081
|
4110
|
{
|
|
@@ -4602,6 +4631,7 @@ cmRC_t cmWhFiltInit( cmWhFilt* p, unsigned binCnt, cmReal_t binHz, cmReal_t c
|
4602
|
4631
|
cmMemFree(tM);
|
4603
|
4632
|
|
4604
|
4633
|
//cmVOR_PrintL("whM",NULL,p->bandCnt,p->binCnt,p->whM);
|
|
4634
|
+ //cmVectArrayWriteMatrixR(p->obj.ctx, "/home/kevin/temp/frqtrk/whM.va", p->whM, p->binCnt, p->bandCnt );
|
4605
|
4635
|
|
4606
|
4636
|
unsigned whiN = p->bandCnt+2;
|
4607
|
4637
|
p->whiV = cmMemResizeZ(cmReal_t,p->whiV,whiN);
|
|
@@ -4618,6 +4648,7 @@ cmRC_t cmWhFiltInit( cmWhFilt* p, unsigned binCnt, cmReal_t binHz, cmReal_t c
|
4618
|
4648
|
}
|
4619
|
4649
|
|
4620
|
4650
|
//cmVOR_PrintL("whiV",NULL,1,whiN,p->whiV);
|
|
4651
|
+ //cmVectArrayWriteMatrixR(p->obj.ctx, "/home/kevin/temp/frqtrk/whiV.va", p->whiV, whiN, 1 );
|
4621
|
4652
|
|
4622
|
4653
|
return rc;
|
4623
|
4654
|
}
|
|
@@ -4641,8 +4672,14 @@ cmRC_t cmWhFiltExec( cmWhFilt* p, const cmReal_t* xV, cmReal_t* yV, unsigned
|
4641
|
4672
|
|
4642
|
4673
|
//cmVOR_PrintL("b0V",NULL,1,p->bandCnt,b0V);
|
4643
|
4674
|
|
|
4675
|
+ // BEWARE: zeros in b0V will generate Inf's when sent
|
|
4676
|
+ // through the cmVOR_PowVS() function.
|
|
4677
|
+ int i;
|
|
4678
|
+ for(i=0; i<p->bandCnt; ++i)
|
|
4679
|
+ if( b0V[i] < 0.000001 )
|
|
4680
|
+ b0V[i] = 0.000001;
|
|
4681
|
+
|
4644
|
4682
|
// apply a non-linear expansion function to each band
|
4645
|
|
- // (BEWARE: zeros in b0V will generate Inf's)
|
4646
|
4683
|
cmVOR_PowVS(b0V,p->bandCnt,p->coeff-1);
|
4647
|
4684
|
|
4648
|
4685
|
//cmVOR_PrintL("b0V",NULL,1,p->bandCnt,b0V);
|
|
@@ -4673,6 +4710,7 @@ cmFrqTrk* cmFrqTrkAlloc( cmCtx* c, cmFrqTrk* p, const cmFrqTrkArgs_t* a )
|
4673
|
4710
|
op->logVa = cmVectArrayAlloc(c,kRealVaFl);
|
4674
|
4711
|
op->levelVa = cmVectArrayAlloc(c,kRealVaFl);
|
4675
|
4712
|
op->specVa = cmVectArrayAlloc(c,kRealVaFl);
|
|
4713
|
+ op->attenVa = cmVectArrayAlloc(c,kRealVaFl);
|
4676
|
4714
|
|
4677
|
4715
|
op->wf = cmWhFiltAlloc(c,NULL,0,0,0,0);
|
4678
|
4716
|
|
|
@@ -4706,9 +4744,11 @@ cmRC_t cmFrqTrkFree( cmFrqTrk** pp )
|
4706
|
4744
|
cmMemFree(p->dbM);
|
4707
|
4745
|
cmMemFree(p->pkiV);
|
4708
|
4746
|
cmMemFree(p->dbV);
|
|
4747
|
+ cmMemFree(p->aV);
|
4709
|
4748
|
cmVectArrayFree(&p->logVa);
|
4710
|
4749
|
cmVectArrayFree(&p->levelVa);
|
4711
|
4750
|
cmVectArrayFree(&p->specVa);
|
|
4751
|
+ cmVectArrayFree(&p->attenVa);
|
4712
|
4752
|
cmWhFiltFree(&p->wf);
|
4713
|
4753
|
cmMemFree(p->logFn);
|
4714
|
4754
|
cmMemFree(p->levelFn);
|
|
@@ -4727,8 +4767,9 @@ cmRC_t cmFrqTrkInit( cmFrqTrk* p, const cmFrqTrkArgs_t* a )
|
4727
|
4767
|
p->a = *a;
|
4728
|
4768
|
p->ch = cmMemResizeZ(cmFrqTrkCh_t,p->ch,a->chCnt );
|
4729
|
4769
|
p->hN = cmMax(1,a->wndSecs * a->srate / a->hopSmpCnt );
|
4730
|
|
- p->sN = p->hN;
|
4731
|
|
- p->bN = p->a.binCnt;
|
|
4770
|
+ p->sN = 4*p->hN;
|
|
4771
|
+ p->binHz = a->srate / ((p->a.binCnt-1)*2);
|
|
4772
|
+ p->bN = cmMin( p->a.binCnt, ceil(p->a.pkMaxHz / p->binHz ));
|
4732
|
4773
|
p->dbM = cmMemResizeZ(cmReal_t,p->dbM,p->hN*p->bN);
|
4733
|
4774
|
p->hi = 0;
|
4734
|
4775
|
p->fN = 0;
|
|
@@ -4737,7 +4778,9 @@ cmRC_t cmFrqTrkInit( cmFrqTrk* p, const cmFrqTrkArgs_t* a )
|
4737
|
4778
|
p->deadN_max = a->maxTrkDeadSec * a->srate / a->hopSmpCnt;
|
4738
|
4779
|
p->minTrkN = a->minTrkSec * a->srate / a->hopSmpCnt;
|
4739
|
4780
|
p->nextTrkId = 1;
|
4740
|
|
-
|
|
4781
|
+ p->aV = cmMemResizeZ(cmReal_t,p->aV,p->a.binCnt);
|
|
4782
|
+ p->attenPhsMax = cmMax(3,a->attenAtkSec * a->srate / a->hopSmpCnt );
|
|
4783
|
+
|
4741
|
4784
|
if( a->logFn != NULL )
|
4742
|
4785
|
p->logFn = cmMemResizeStr(p->logFn,a->logFn);
|
4743
|
4786
|
|
|
@@ -4747,10 +4790,11 @@ cmRC_t cmFrqTrkInit( cmFrqTrk* p, const cmFrqTrkArgs_t* a )
|
4747
|
4790
|
if( a->specFn != NULL )
|
4748
|
4791
|
p->specFn = cmMemResizeStr(p->specFn,a->specFn);
|
4749
|
4792
|
|
4750
|
|
- p->binHz = a->srate / ((p->a.binCnt-1)*2);
|
|
4793
|
+ if( a->attenFn != NULL )
|
|
4794
|
+ p->attenFn = cmMemResizeStr(p->attenFn,a->attenFn);
|
4751
|
4795
|
|
4752
|
|
- cmReal_t whFiltCoeff = 0.33;
|
4753
|
|
- if(cmWhFiltInit(p->wf,p->a.binCnt,p->binHz,whFiltCoeff,a->srate/2) != cmOkRC )
|
|
4796
|
+
|
|
4797
|
+ if(cmWhFiltInit(p->wf,p->bN,p->binHz,p->a.whFiltCoeff,p->a.pkMaxHz) != cmOkRC )
|
4754
|
4798
|
cmCtxRtCondition(&p->obj, cmSubSysFailRC, "Whitening filter intitialization failed.");
|
4755
|
4799
|
|
4756
|
4800
|
unsigned i;
|
|
@@ -4776,6 +4820,9 @@ cmRC_t cmFrqTrkFinal( cmFrqTrk* p )
|
4776
|
4820
|
if( p->specFn != NULL )
|
4777
|
4821
|
cmVectArrayWrite(p->specVa,p->specFn);
|
4778
|
4822
|
|
|
4823
|
+ if( p->attenFn != NULL )
|
|
4824
|
+ cmVectArrayWrite(p->attenVa,p->attenFn);
|
|
4825
|
+
|
4779
|
4826
|
cmWhFiltFinal(p->wf);
|
4780
|
4827
|
return rc;
|
4781
|
4828
|
}
|
|
@@ -4792,7 +4839,7 @@ cmFrqTrkCh_t* _cmFrqTrkFindAvailCh( cmFrqTrk* p )
|
4792
|
4839
|
}
|
4793
|
4840
|
|
4794
|
4841
|
|
4795
|
|
-// Estimate the peak frequency by parabolic interpolotion into hzV[p->a.binCnt]
|
|
4842
|
+// Estimate the peak frequency by parabolic interpolotion into hzV[p->bN]
|
4796
|
4843
|
void _cmFrqTrkMagnToHz( cmFrqTrk* p, const cmReal_t* dbV, unsigned* pkiV, unsigned pkN, cmReal_t* hzV )
|
4797
|
4844
|
{
|
4798
|
4845
|
unsigned i;
|
|
@@ -4802,10 +4849,15 @@ void _cmFrqTrkMagnToHz( cmFrqTrk* p, const cmReal_t* dbV, unsigned* pkiV, unsign
|
4802
|
4849
|
unsigned pki = pkiV[i];
|
4803
|
4850
|
cmReal_t y0 = pki>0 ? dbV[ pki-1 ] : dbV[pki];
|
4804
|
4851
|
cmReal_t y1 = dbV[ pki ];
|
4805
|
|
- cmReal_t y2 = pki<p->a.binCnt-1 ? dbV[ pki+1 ] : dbV[pki];
|
|
4852
|
+ cmReal_t y2 = pki<p->bN-1 ? dbV[ pki+1 ] : dbV[pki];
|
4806
|
4853
|
cmReal_t den = y0 - (2.*y1) + y2;
|
4807
|
4854
|
cmReal_t offs = den==0 ? 0 : 0.5 * ((y0 - y2) / den);
|
4808
|
4855
|
hzV[pki] = p->binHz * (pki+offs);
|
|
4856
|
+
|
|
4857
|
+ //if( hzV[pki] < 0 )
|
|
4858
|
+ //{
|
|
4859
|
+ // printf("%f : %f %f %f : %f %f\n",hzV[pki],y0,y1,y2,den,offs);
|
|
4860
|
+ //}
|
4809
|
4861
|
}
|
4810
|
4862
|
}
|
4811
|
4863
|
|
|
@@ -4853,15 +4905,15 @@ void _cmFrqTrkWriteLog( cmFrqTrk* p )
|
4853
|
4905
|
// sn = count of elements in the summary sub-vector
|
4854
|
4906
|
unsigned sn = 3;
|
4855
|
4907
|
|
4856
|
|
- // each active channel will emit 6 values
|
4857
|
|
- unsigned nn = 1 + n*6 + sn;
|
|
4908
|
+ // each active channel will emit 7 values
|
|
4909
|
+ unsigned nn = 1 + n*7 + sn;
|
4858
|
4910
|
|
4859
|
4911
|
// allocate the row vector
|
4860
|
4912
|
vb = cmMemResize(cmReal_t,vb,nn);
|
4861
|
4913
|
|
4862
|
4914
|
// row format
|
4863
|
4915
|
// [ nn idV[n] hzV[n] ... hsV[n] smV[sn] ]
|
4864
|
|
- // n = (nn - (1 + sn)) / 6
|
|
4916
|
+ // n = (nn - (1 + sn)) / 7
|
4865
|
4917
|
|
4866
|
4918
|
*vb = nn; // the first element in the vector contains the length of the row
|
4867
|
4919
|
|
|
@@ -4874,7 +4926,8 @@ void _cmFrqTrkWriteLog( cmFrqTrk* p )
|
4874
|
4926
|
cmReal_t* stV = v + n * 3;
|
4875
|
4927
|
cmReal_t* dsV = v + n * 4;
|
4876
|
4928
|
cmReal_t* hsV = v + n * 5;
|
4877
|
|
- cmReal_t* smV = v + n * 6; // summary information
|
|
4929
|
+ cmReal_t* agV = v + n * 6;
|
|
4930
|
+ cmReal_t* smV = v + n * 7; // summary information
|
4878
|
4931
|
|
4879
|
4932
|
smV[0] = p->newTrkCnt;
|
4880
|
4933
|
smV[1] = p->curTrkCnt;
|
|
@@ -4895,6 +4948,7 @@ void _cmFrqTrkWriteLog( cmFrqTrk* p )
|
4895
|
4948
|
stV[j] = p->ch[i].dN;
|
4896
|
4949
|
dsV[j] = p->ch[i].db_std;
|
4897
|
4950
|
hsV[j] = p->ch[i].hz_std;
|
|
4951
|
+ agV[j] = p->ch[i].attenGain;
|
4898
|
4952
|
++j;
|
4899
|
4953
|
}
|
4900
|
4954
|
|
|
@@ -4964,7 +5018,92 @@ void _cmFrqTrkScoreChs( cmFrqTrk* p )
|
4964
|
5018
|
c->db_std = sqrt(cmVOR_Variance( c->dbV,n,&c->db_mean));
|
4965
|
5019
|
c->hz_mean = cmVOR_Mean(c->hzV,n);
|
4966
|
5020
|
c->hz_std = sqrt(cmVOR_Variance( c->hzV,n,&c->hz_mean));
|
|
5021
|
+
|
|
5022
|
+ c->score = c->db / ((cmMin(0.1,c->db_std) + cmMin(0.1,c->hz_std))/2);
|
|
5023
|
+ }
|
|
5024
|
+}
|
|
5025
|
+
|
|
5026
|
+void _cmFrqTrkApplyAtten( cmFrqTrk* p, cmReal_t* aV, cmReal_t gain, cmReal_t hz )
|
|
5027
|
+{
|
|
5028
|
+ int cbi = cmMin(p->a.binCnt,cmMax(0,round(hz/p->binHz)));
|
|
5029
|
+ cmReal_t map[] = { .25, .5, 1, .5, .25 };
|
|
5030
|
+ int mapN = sizeof(map)/sizeof(map[0]);
|
|
5031
|
+ int j;
|
|
5032
|
+
|
|
5033
|
+ int ai = cbi - mapN/2;
|
|
5034
|
+
|
|
5035
|
+ for(j=0; j<mapN; ++j,++ai)
|
|
5036
|
+ if( 0 <= ai && ai < p->a.binCnt )
|
|
5037
|
+ aV[ai] *= 1.0 - (map[j] * gain);
|
|
5038
|
+
|
|
5039
|
+}
|
|
5040
|
+
|
|
5041
|
+void _cmFrqTrkUpdateFilter( cmFrqTrk* p )
|
|
5042
|
+{
|
|
5043
|
+ unsigned i;
|
|
5044
|
+ cmVOR_Fill(p->aV,p->a.binCnt,1.0);
|
|
5045
|
+
|
|
5046
|
+ for(i=0; i<p->a.chCnt; ++i)
|
|
5047
|
+ if( p->ch[i].activeFl )
|
|
5048
|
+ {
|
|
5049
|
+ cmFrqTrkCh_t* c = p->ch + i;
|
|
5050
|
+ //
|
|
5051
|
+ if( c->score >= p->a.attenThresh && c->state == kNoStateFrqTrkId )
|
|
5052
|
+ {
|
|
5053
|
+ c->attenPhsIdx = 0;
|
|
5054
|
+ c->state = kAtkFrqTrkId;
|
|
5055
|
+ }
|
|
5056
|
+
|
|
5057
|
+ switch( c->state )
|
|
5058
|
+ {
|
|
5059
|
+ case kNoStateFrqTrkId:
|
|
5060
|
+ break;
|
|
5061
|
+
|
|
5062
|
+ case kAtkFrqTrkId:
|
|
5063
|
+ if( c->attenPhsIdx < p->attenPhsMax )
|
|
5064
|
+ {
|
|
5065
|
+ _cmFrqTrkApplyAtten(p, p->aV, c->attenGain, c->hz);
|
|
5066
|
+ }
|
|
5067
|
+
|
|
5068
|
+ c->attenPhsIdx += 1;
|
|
5069
|
+ if( c->attenPhsIdx >= p->attenPhsMax )
|
|
5070
|
+ c->state = kSusFrqTrkId;
|
|
5071
|
+ break;
|
|
5072
|
+
|
|
5073
|
+ case kSusFrqTrkId:
|
|
5074
|
+
|
|
5075
|
+ if( c->dN > 0 )
|
|
5076
|
+ {
|
|
5077
|
+ if( c->attenPhsIdx > 0 )
|
|
5078
|
+ {
|
|
5079
|
+ c->attenPhsIdx -= 1;
|
|
5080
|
+ c->attenGain = cmMin(1.0,p->a.attenGain * c->attenPhsIdx / p->attenPhsMax);
|
|
5081
|
+ }
|
|
5082
|
+ }
|
|
5083
|
+
|
|
5084
|
+ _cmFrqTrkApplyAtten(p,p->aV, c->attenGain, c->hz);
|
|
5085
|
+
|
|
5086
|
+ if( c->dN >= p->deadN_max )
|
|
5087
|
+ c->state = kDcyFrqTrkId;
|
|
5088
|
+
|
|
5089
|
+ break;
|
|
5090
|
+
|
|
5091
|
+ case kDcyFrqTrkId:
|
|
5092
|
+ if( c->attenPhsIdx > 0 )
|
|
5093
|
+ {
|
|
5094
|
+ c->attenPhsIdx -= 1;
|
|
5095
|
+ c->attenGain = cmMin(1.0,p->a.attenGain * c->attenPhsIdx / p->attenPhsMax);
|
|
5096
|
+ _cmFrqTrkApplyAtten(p,p->aV, c->attenGain, c->hz);
|
|
5097
|
+ }
|
|
5098
|
+
|
|
5099
|
+ if( c->attenPhsIdx == 0 )
|
|
5100
|
+ c->activeFl = false;
|
|
5101
|
+
|
|
5102
|
+ break;
|
|
5103
|
+ }
|
4967
|
5104
|
}
|
|
5105
|
+
|
|
5106
|
+
|
4968
|
5107
|
}
|
4969
|
5108
|
|
4970
|
5109
|
// Extend the existing trackers
|
|
@@ -4996,7 +5135,9 @@ void _cmFrqTrkExtendChs( cmFrqTrk* p, const cmReal_t* dbV, const cmReal_t* hzV,
|
4996
|
5135
|
|
4997
|
5136
|
if( c->dN >= p->deadN_max )
|
4998
|
5137
|
{
|
4999
|
|
- c->activeFl = false;
|
|
5138
|
+ if( c->attenPhsIdx == 0 )
|
|
5139
|
+ c->activeFl = false;
|
|
5140
|
+
|
5000
|
5141
|
p->deadTrkCnt += 1;
|
5001
|
5142
|
}
|
5002
|
5143
|
}
|
|
@@ -5046,7 +5187,7 @@ unsigned _cmFrqTrkMaxEnergyPeakIndex( const cmFrqTrk* p, const cmReal_t* dbV, co
|
5046
|
5187
|
unsigned i;
|
5047
|
5188
|
|
5048
|
5189
|
for(i=0; i<pkN; ++i)
|
5049
|
|
- if( pkiV[i] != cmInvalidIdx && dbV[pkiV[i]] >= mv && hzV[pkiV[i]] < p->a.pkAtkMaxHz )
|
|
5190
|
+ if( pkiV[i] != cmInvalidIdx && dbV[pkiV[i]] >= mv && hzV[pkiV[i]] < p->a.pkMaxHz )
|
5050
|
5191
|
{
|
5051
|
5192
|
mi = i;
|
5052
|
5193
|
mv = dbV[pkiV[i]];
|
|
@@ -5084,6 +5225,11 @@ void _cmFrqTrkNewChs( cmFrqTrk* p, const cmReal_t* dbV, const cmReal_t* hzV, uns
|
5084
|
5225
|
c->si = 0;
|
5085
|
5226
|
c->sn = 0;
|
5086
|
5227
|
|
|
5228
|
+ c->score = 0;
|
|
5229
|
+ c->state = kNoStateFrqTrkId;
|
|
5230
|
+ c->attenPhsIdx = cmInvalidIdx;
|
|
5231
|
+ c->attenGain = 1.0;
|
|
5232
|
+
|
5087
|
5233
|
// mark the peak as unavailable
|
5088
|
5234
|
pkiV[ db_max_idx ] = cmInvalidIdx;
|
5089
|
5235
|
|
|
@@ -5111,6 +5257,21 @@ cmRC_t cmFrqTrkExec( cmFrqTrk* p, const cmReal_t* magV, const cmReal_t* phsV, co
|
5111
|
5257
|
cmVOR_CopyN(p->dbM + p->hi, p->bN, p->hN, p->dbV, 1 );
|
5112
|
5258
|
//cmVOR_CopyN(p->dbM + p->hi, p->bN, p->hN, whV, 1 );
|
5113
|
5259
|
|
|
5260
|
+ if( 1 )
|
|
5261
|
+ {
|
|
5262
|
+ cmReal_t powV[ p->bN ];
|
|
5263
|
+ cmVOR_MultVVV(powV,p->bN,magV,magV);
|
|
5264
|
+ cmWhFiltExec(p->wf,powV,p->dbV,p->bN);
|
|
5265
|
+ }
|
|
5266
|
+ else
|
|
5267
|
+ {
|
|
5268
|
+ // convert magV to Decibels
|
|
5269
|
+ cmVOR_AmplToDbVV(p->dbV,p->bN, magV, -200.0);
|
|
5270
|
+ }
|
|
5271
|
+
|
|
5272
|
+ // copy p->dbV to dbM[hi,:]
|
|
5273
|
+ cmVOR_CopyN(p->dbM + p->hi, p->bN, p->hN, p->dbV, 1 );
|
|
5274
|
+
|
5114
|
5275
|
// increment hi
|
5115
|
5276
|
p->hi = (p->hi + 1) % p->hN;
|
5116
|
5277
|
|
|
@@ -5124,7 +5285,7 @@ cmRC_t cmFrqTrkExec( cmFrqTrk* p, const cmReal_t* magV, const cmReal_t* phsV, co
|
5124
|
5285
|
// set the indexes of the peaks above pkThreshDb in i0[]
|
5125
|
5286
|
unsigned pkN = cmVOR_PeakIndexes(p->pkiV, p->bN, p->dbV, p->bN, p->a.pkThreshDb );
|
5126
|
5287
|
|
5127
|
|
- //
|
|
5288
|
+ // generate the peak frequencies from the magnitude
|
5128
|
5289
|
_cmFrqTrkMagnToHz(p, p->dbV, p->pkiV, pkN, hzV );
|
5129
|
5290
|
|
5130
|
5291
|
// extend the existing trackers
|
|
@@ -5135,8 +5296,12 @@ cmRC_t cmFrqTrkExec( cmFrqTrk* p, const cmReal_t* magV, const cmReal_t* phsV, co
|
5135
|
5296
|
// create new trackers
|
5136
|
5297
|
_cmFrqTrkNewChs(p,p->dbV,hzV,p->pkiV,pkN);
|
5137
|
5298
|
|
|
5299
|
+ //
|
5138
|
5300
|
_cmFrqTrkScoreChs(p);
|
5139
|
5301
|
|
|
5302
|
+ //
|
|
5303
|
+ _cmFrqTrkUpdateFilter(p);
|
|
5304
|
+
|
5140
|
5305
|
// write the log file
|
5141
|
5306
|
_cmFrqTrkWriteLog(p);
|
5142
|
5307
|
|
|
@@ -5144,6 +5309,10 @@ cmRC_t cmFrqTrkExec( cmFrqTrk* p, const cmReal_t* magV, const cmReal_t* phsV, co
|
5144
|
5309
|
if( p->specFn != NULL )
|
5145
|
5310
|
cmVectArrayAppendR(p->specVa,p->dbV,p->bN);
|
5146
|
5311
|
|
|
5312
|
+ // write the atten output file
|
|
5313
|
+ if( p->attenFn != NULL )
|
|
5314
|
+ cmVectArrayAppendR(p->attenVa,p->aV,p->bN);
|
|
5315
|
+
|
5147
|
5316
|
// write the the level file
|
5148
|
5317
|
_cmFrqTrkWriteLevel(p,p->dbV,hzV,p->bN);
|
5149
|
5318
|
}
|
|
@@ -5157,7 +5326,7 @@ void cmFrqTrkPrint( cmFrqTrk* p )
|
5157
|
5326
|
{
|
5158
|
5327
|
printf("srate: %f\n",p->a.srate);
|
5159
|
5328
|
printf("chCnt: %i\n",p->a.chCnt);
|
5160
|
|
- printf("binCnt: %i\n",p->a.binCnt);
|
|
5329
|
+ printf("binCnt: %i (bN=%i)\n",p->a.binCnt,p->bN);
|
5161
|
5330
|
printf("hopSmpCnt: %i\n",p->a.hopSmpCnt);
|
5162
|
5331
|
printf("stRange: %f\n",p->a.stRange);
|
5163
|
5332
|
printf("wndSecs: %f (%i)\n",p->a.wndSecs,p->hN);
|
|
@@ -5225,19 +5394,26 @@ cmRC_t cmSpecDistInit( cmSpecDist_t* p, unsigned procSmpCnt, double srate, unsig
|
5225
|
5394
|
p->pvs = cmPvSynAlloc( p->obj.ctx, NULL, procSmpCnt, srate, wndSmpCnt, p->hopSmpCnt, olaWndTypeId );
|
5226
|
5395
|
|
5227
|
5396
|
fta.srate = srate;
|
5228
|
|
- fta.chCnt = 20;
|
|
5397
|
+ fta.chCnt = 50;
|
5229
|
5398
|
fta.binCnt = p->pva->binCnt;
|
5230
|
5399
|
fta.hopSmpCnt = p->pva->hopSmpCnt;
|
5231
|
5400
|
fta.stRange = 0.25;
|
5232
|
|
- fta.wndSecs = 0.5;
|
|
5401
|
+ fta.wndSecs = 0.25;
|
5233
|
5402
|
fta.minTrkSec = 0.25;
|
5234
|
5403
|
fta.maxTrkDeadSec = 0.25;
|
5235
|
|
- fta.pkThreshDb = 0.2; //-110.0;
|
5236
|
|
- fta.pkAtkThreshDb = 0.9; //-60.0;
|
5237
|
|
- fta.pkAtkMaxHz = 10000;
|
|
5404
|
+ fta.pkThreshDb = 0.1; //-110.0;
|
|
5405
|
+ fta.pkAtkThreshDb = 0.5; //-60.0;
|
|
5406
|
+ fta.pkMaxHz = 10000;
|
|
5407
|
+ fta.whFiltCoeff = 0.33;
|
|
5408
|
+
|
|
5409
|
+ fta.attenThresh = 900.0;
|
|
5410
|
+ fta.attenGain = 0.9;
|
|
5411
|
+ fta.attenAtkSec = 0.1;
|
|
5412
|
+
|
5238
|
5413
|
fta.logFn = "/home/kevin/temp/frqtrk/trk_log.va";
|
5239
|
5414
|
fta.levelFn = "/home/kevin/temp/frqtrk/level.va";
|
5240
|
5415
|
fta.specFn = "/home/kevin/temp/frqtrk/spec.va";
|
|
5416
|
+ fta.attenFn = "/home/kevin/temp/frqtrk/atten.va";
|
5241
|
5417
|
|
5242
|
5418
|
p->ft = cmFrqTrkAlloc( p->obj.ctx, NULL, &fta );
|
5243
|
5419
|
cmFrqTrkPrint(p->ft);
|
|
@@ -5462,8 +5638,12 @@ cmRC_t cmSpecDistExec( cmSpecDist_t* p, const cmSample_t* sp, unsigned sn )
|
5462
|
5638
|
|
5463
|
5639
|
cmFrqTrkExec(p->ft, p->pva->magV, p->pva->phsV, NULL );
|
5464
|
5640
|
|
5465
|
|
- cmVOR_AmplToDbVV(X1m, p->pva->binCnt, p->pva->magV, -1000.0 );
|
5466
|
|
-
|
|
5641
|
+ // apply the freq track suppression filter
|
|
5642
|
+ cmVOR_MultVVV(X1m, p->pva->binCnt,p->pva->magV,p->ft->aV );
|
|
5643
|
+
|
|
5644
|
+ //cmVOR_AmplToDbVV(X1m, p->pva->binCnt, p->pva->magV, -1000.0 );
|
|
5645
|
+ cmVOR_AmplToDbVV(X1m, p->pva->binCnt, X1m, -1000.0 );
|
|
5646
|
+
|
5467
|
5647
|
switch( p->mode )
|
5468
|
5648
|
{
|
5469
|
5649
|
case kBypassModeSdId:
|