|
@@ -3587,3 +3587,160 @@ struct cmDspClass_str* cmTakeSeqRendClassCons( cmDspCtx_t* ctx )
|
3587
|
3587
|
return &_cmTakeSeqRendDC;
|
3588
|
3588
|
}
|
3589
|
3589
|
|
|
3590
|
+
|
|
3591
|
+//==========================================================================================================================================
|
|
3592
|
+enum
|
|
3593
|
+{
|
|
3594
|
+ kLfsrN_RcId,
|
|
3595
|
+ kMlsCoeff0RcId,
|
|
3596
|
+ kMlsCoeff1RcId,
|
|
3597
|
+ kSmpPerChipRcId,
|
|
3598
|
+ kRcosBetaRcId,
|
|
3599
|
+ kRcosOS_RcId,
|
|
3600
|
+ kCarrierHzRcId,
|
|
3601
|
+ kAtkDcyMsRcId,
|
|
3602
|
+ kPhatAlphaRcId,
|
|
3603
|
+ kPhatMultRcId,
|
|
3604
|
+ kInRcId,
|
|
3605
|
+ kOutRcId,
|
|
3606
|
+};
|
|
3607
|
+
|
|
3608
|
+cmDspClass_t _cmReflectCalcDC;
|
|
3609
|
+
|
|
3610
|
+typedef struct
|
|
3611
|
+{
|
|
3612
|
+ cmDspInst_t inst;
|
|
3613
|
+ cmReflectCalc_t* r;
|
|
3614
|
+} cmDspReflectCalc_t;
|
|
3615
|
+
|
|
3616
|
+
|
|
3617
|
+cmDspInst_t* _cmDspReflectCalcAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
|
|
3618
|
+{
|
|
3619
|
+
|
|
3620
|
+ /*
|
|
3621
|
+ if( va_cnt !=3 )
|
|
3622
|
+ {
|
|
3623
|
+ cmDspClassErr(ctx,classPtr,kVarArgParseFailDspRC,"The 'ReflectCalc' constructor must have two arguments: a channel count and frequency array.");
|
|
3624
|
+ return NULL;
|
|
3625
|
+ }
|
|
3626
|
+ */
|
|
3627
|
+
|
|
3628
|
+ cmDspReflectCalc_t* p = cmDspInstAllocV(cmDspReflectCalc_t,ctx,classPtr,instSymId,id,storeSymId,va_cnt,vl,
|
|
3629
|
+ 1, "lfsrN", kLfsrN_RcId, 0,0, kInDsvFl | kUIntDsvFl, "Gold code generator LFSR length",
|
|
3630
|
+ 1, "mlsc0", kMlsCoeff0RcId, 0,0, kInDsvFl | kUIntDsvFl, "LFSR coefficient 0",
|
|
3631
|
+ 1, "mlsc1", kMlsCoeff1RcId, 0,0, kInDsvFl | kUIntDsvFl, "LFSR coefficient 0",
|
|
3632
|
+ 1, "spchip",kSmpPerChipRcId,0,0, kInDsvFl | kUIntDsvFl, "Samples per spreading code bit.",
|
|
3633
|
+ 1, "rcosb", kRcosBetaRcId, 0,0, kInDsvFl | kDoubleDsvFl, "Raised cosine beta",
|
|
3634
|
+ 1, "rcosos",kRcosOS_RcId, 0,0, kInDsvFl | kUIntDsvFl, "Raised cosine oversample factor.",
|
|
3635
|
+ 1, "carhz", kCarrierHzRcId, 0,0, kInDsvFl | kDoubleDsvFl, "Carrier frequency in Hertz.",
|
|
3636
|
+ 1, "envms", kAtkDcyMsRcId, 0,0, kInDsvFl | kDoubleDsvFl, "Signal Attack/Decay milliseconds.",
|
|
3637
|
+ 1, "alpha", kPhatAlphaRcId, 0,0, kInDsvFl | kDoubleDsvFl, "PHAT alpha coefficient.",
|
|
3638
|
+ 1, "mult", kPhatMultRcId, 0,0, kInDsvFl | kUIntDsvFl, "PHAT multiplier coefficient.",
|
|
3639
|
+ 1, "in", kInRcId, 0,1, kInDsvFl | kAudioBufDsvFl,"Audio input",
|
|
3640
|
+ 1, "out", kOutRcId, 0,1, kOutDsvFl | kAudioBufDsvFl,"Audio output",
|
|
3641
|
+ 0 );
|
|
3642
|
+
|
|
3643
|
+
|
|
3644
|
+p->r = cmReflectCalcAlloc(ctx->cmProcCtx, NULL, NULL, 0, 0 );
|
|
3645
|
+
|
|
3646
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kLfsrN_RcId, 0, 8);
|
|
3647
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kMlsCoeff0RcId, 0, 0x8e);
|
|
3648
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kMlsCoeff1RcId, 0, 0x96);
|
|
3649
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kSmpPerChipRcId, 0, 64);
|
|
3650
|
+ cmDspSetDefaultDouble( ctx, &p->inst, kRcosBetaRcId, 0, 0.5);
|
|
3651
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kRcosOS_RcId, 0, 4);
|
|
3652
|
+ cmDspSetDefaultDouble( ctx, &p->inst, kCarrierHzRcId, 0, 2500.0);
|
|
3653
|
+ cmDspSetDefaultDouble( ctx, &p->inst, kAtkDcyMsRcId, 0, 50.0);
|
|
3654
|
+ cmDspSetDefaultDouble( ctx, &p->inst, kPhatAlphaRcId, 0, 0.5);
|
|
3655
|
+ cmDspSetDefaultUInt( ctx, &p->inst, kPhatMultRcId, 0, 4);
|
|
3656
|
+
|
|
3657
|
+ return &p->inst;
|
|
3658
|
+}
|
|
3659
|
+
|
|
3660
|
+cmDspRC_t _cmDspReflectCalcSetup( cmDspCtx_t* ctx, cmDspInst_t* inst )
|
|
3661
|
+{
|
|
3662
|
+ cmDspRC_t rc = kOkDspRC;
|
|
3663
|
+ cmDspReflectCalc_t* p = (cmDspReflectCalc_t*)inst;
|
|
3664
|
+ cmGoldSigArg_t gsa;
|
|
3665
|
+
|
|
3666
|
+ gsa.chN = 1;
|
|
3667
|
+ gsa.srate = cmDspSampleRate(ctx);
|
|
3668
|
+ gsa.lfsrN = cmDspUInt(inst,kLfsrN_RcId);
|
|
3669
|
+ gsa.mlsCoeff0 = cmDspUInt(inst,kMlsCoeff0RcId);
|
|
3670
|
+ gsa.mlsCoeff1 = cmDspUInt(inst,kMlsCoeff1RcId);
|
|
3671
|
+ gsa.samplesPerChip = cmDspUInt(inst,kSmpPerChipRcId);
|
|
3672
|
+ gsa.rcosBeta = cmDspDouble(inst,kRcosBetaRcId);
|
|
3673
|
+ gsa.rcosOSFact = cmDspUInt(inst,kRcosOS_RcId);
|
|
3674
|
+ gsa.carrierHz = cmDspDouble(inst,kCarrierHzRcId);
|
|
3675
|
+ gsa.envMs = cmDspDouble(inst,kAtkDcyMsRcId);
|
|
3676
|
+
|
|
3677
|
+ double phatAlpha = cmDspDouble(inst,kPhatAlphaRcId);
|
|
3678
|
+ unsigned phatMult = cmDspUInt(inst,kPhatMultRcId);
|
|
3679
|
+
|
|
3680
|
+ if( cmReflectCalcInit(p->r,&gsa,phatAlpha,phatMult) != cmOkRC )
|
|
3681
|
+ rc = cmErrMsg(&inst->classPtr->err, kSubSysFailDspRC, "Unable to initialize the internal ReflectCalc detector.");
|
|
3682
|
+
|
|
3683
|
+ return rc;
|
|
3684
|
+}
|
|
3685
|
+
|
|
3686
|
+cmDspRC_t _cmDspReflectCalcFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
|
3687
|
+{
|
|
3688
|
+ cmDspRC_t rc = kOkDspRC;
|
|
3689
|
+ cmDspReflectCalc_t* p = (cmDspReflectCalc_t*)inst;
|
|
3690
|
+
|
|
3691
|
+ cmReflectCalcFree(&p->r);
|
|
3692
|
+
|
|
3693
|
+ return rc;
|
|
3694
|
+}
|
|
3695
|
+
|
|
3696
|
+cmDspRC_t _cmDspReflectCalcReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
|
3697
|
+{
|
|
3698
|
+//cmDspReflectCalc_t* p = (cmDspReflectCalc_t*)inst;
|
|
3699
|
+
|
|
3700
|
+ cmDspApplyAllDefaults(ctx,inst);
|
|
3701
|
+
|
|
3702
|
+ return _cmDspReflectCalcSetup(ctx, inst );
|
|
3703
|
+}
|
|
3704
|
+
|
|
3705
|
+cmDspRC_t _cmDspReflectCalcExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
|
3706
|
+{
|
|
3707
|
+ cmDspRC_t rc = kOkDspRC;
|
|
3708
|
+ cmDspReflectCalc_t* p = (cmDspReflectCalc_t*)inst;
|
|
3709
|
+ const cmSample_t* xV = cmDspAudioBuf(ctx,inst,kInRcId,0);
|
|
3710
|
+ unsigned xN = cmDspAudioBufSmpCount(ctx,inst,kInRcId,0);
|
|
3711
|
+ cmSample_t* yV = cmDspAudioBuf(ctx,inst,kOutRcId,0);
|
|
3712
|
+ unsigned yN = cmDspAudioBufSmpCount(ctx,inst,kOutRcId,0);
|
|
3713
|
+
|
|
3714
|
+ if( xV != NULL && yV != NULL )
|
|
3715
|
+ {
|
|
3716
|
+ assert( xN == yN );
|
|
3717
|
+ cmReflectCalcExec(p->r,xV,yV,xN);
|
|
3718
|
+ }
|
|
3719
|
+
|
|
3720
|
+ return rc;
|
|
3721
|
+}
|
|
3722
|
+
|
|
3723
|
+cmDspRC_t _cmDspReflectCalcRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
|
3724
|
+{
|
|
3725
|
+//cmDspReflectCalc_t* p = (cmDspReflectCalc_t*)inst;
|
|
3726
|
+
|
|
3727
|
+ cmDspSetEvent(ctx,inst,evt);
|
|
3728
|
+
|
|
3729
|
+ return kOkDspRC;
|
|
3730
|
+}
|
|
3731
|
+
|
|
3732
|
+struct cmDspClass_str* cmReflectCalcClassCons( cmDspCtx_t* ctx )
|
|
3733
|
+{
|
|
3734
|
+ cmDspClassSetup(&_cmReflectCalcDC,ctx,"ReflectCalc",
|
|
3735
|
+ NULL,
|
|
3736
|
+ _cmDspReflectCalcAlloc,
|
|
3737
|
+ _cmDspReflectCalcFree,
|
|
3738
|
+ _cmDspReflectCalcReset,
|
|
3739
|
+ _cmDspReflectCalcExec,
|
|
3740
|
+ _cmDspReflectCalcRecv,
|
|
3741
|
+ NULL,
|
|
3742
|
+ NULL,
|
|
3743
|
+ "Reflecttion time calculator");
|
|
3744
|
+
|
|
3745
|
+ return &_cmReflectCalcDC;
|
|
3746
|
+}
|