Browse Source

cmDspKr.h/c : Added initial implementation of cmReflectCalc.

master
kevin 8 years ago
parent
commit
537ad58c39
2 changed files with 158 additions and 0 deletions
  1. 157
    0
      dsp/cmDspKr.c
  2. 1
    0
      dsp/cmDspKr.h

+ 157
- 0
dsp/cmDspKr.c View File

@@ -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
+}

+ 1
- 0
dsp/cmDspKr.h View File

@@ -21,6 +21,7 @@ extern "C" {
21 21
   struct cmDspClass_str* cmSyncRecdClassCons( cmDspCtx_t* ctx );
22 22
   struct cmDspClass_str* cmTakeSeqBldrClassCons( cmDspCtx_t* ctx );
23 23
   struct cmDspClass_str* cmTakeSeqRendClassCons( cmDspCtx_t* ctx );
24
+  struct cmDspClass_str* cmReflectCalcClassCons( cmDspCtx_t* ctx );
24 25
 
25 26
 #ifdef __cplusplus
26 27
 }

Loading…
Cancel
Save