@@ -283,7 +283,7 @@ cos_sin(uint16_t phase)
283283
284284uint16_t nco1_phase = 0 ;
285285uint16_t nco2_phase = 0 ;
286- #define SSB_NCO_PHASESTEP (65536L* SSB_FREQ_OFFSET/48000 )
286+ #define SSB_NCO_PHASESTEP PHASESTEP( SSB_FREQ_OFFSET)
287287
288288
289289// Bi-Quad IIR Filter state
@@ -329,8 +329,22 @@ q15_t bq_coeffs_150hz[] = {
329329arm_biquad_casd_df1_inst_q15 bq_cw_i = { 3 , bq_i_state , bq_coeffs_150hz , 1 };
330330arm_biquad_casd_df1_inst_q15 bq_cw_q = { 3 , bq_q_state , bq_coeffs_150hz , 1 };
331331
332+ typedef struct {
333+ int16_t phasestep1 ;
334+ int16_t phasestep2 ;
335+ arm_biquad_casd_df1_inst_q15 * bq_i ;
336+ arm_biquad_casd_df1_inst_q15 * bq_q ;
337+ } weaver_demod_conf_t ;
338+
339+ const weaver_demod_conf_t usb_demod_conf = {
340+ SSB_NCO_PHASESTEP , SSB_NCO_PHASESTEP , & bq_i , & bq_q
341+ };
342+ const weaver_demod_conf_t lsb_demod_conf = {
343+ - SSB_NCO_PHASESTEP , - SSB_NCO_PHASESTEP , & bq_i , & bq_q
344+ };
345+
332346void
333- ssb_demod (int16_t * src , int16_t * dst , size_t len , int phasestep )
347+ demod_weaver (int16_t * src , int16_t * dst , size_t len , const weaver_demod_conf_t * dc )
334348{
335349 q15_t * bufi = buffer [0 ];
336350 q15_t * bufq = buffer [1 ];
@@ -343,16 +357,16 @@ ssb_demod(int16_t *src, int16_t *dst, size_t len, int phasestep)
343357 // shift frequency
344358 for (i = 0 ; i < len /2 ; i ++ ) {
345359 uint32_t cossin = cos_sin (nco1_phase );
346- nco1_phase -= phasestep ;
360+ nco1_phase -= dc -> phasestep1 ;
347361 uint32_t iq = * s ++ ;
348362 * bufi ++ = __SMLSDX (iq , cossin , 0 ) >> (15 - 0 );
349363 * bufq ++ = __SMLAD (iq , cossin , 0 ) >> (15 - 0 );
350364 }
351365 disp_fetch_samples (B_IF1 , BT_IQ , buffer [0 ], buffer [1 ], len /2 );
352366
353367 // apply low pass filter
354- arm_biquad_cascade_df1_q15 (& bq_i , buffer [0 ], buffer2 [0 ], len /2 );
355- arm_biquad_cascade_df1_q15 (& bq_q , buffer [1 ], buffer2 [1 ], len /2 );
368+ arm_biquad_cascade_df1_q15 (dc -> bq_i , buffer [0 ], buffer2 [0 ], len /2 );
369+ arm_biquad_cascade_df1_q15 (dc -> bq_q , buffer [1 ], buffer2 [1 ], len /2 );
356370
357371 disp_fetch_samples (B_IF2 , BT_IQ , buffer2 [0 ], buffer2 [1 ], len /2 );
358372
@@ -361,7 +375,7 @@ ssb_demod(int16_t *src, int16_t *dst, size_t len, int phasestep)
361375 bufq = buffer2 [1 ];
362376 for (i = 0 ; i < len /2 ; i ++ ) {
363377 uint32_t cossin = cos_sin (nco2_phase );
364- nco2_phase += phasestep ;
378+ nco2_phase += dc -> phasestep2 ;
365379 uint32_t iq = __PKHBT (* bufi ++ , * bufq ++ , 16 );
366380 uint32_t r = __SMLAD (iq , cossin , 0 ) >> (15 - 0 );
367381 * d ++ = __PKHBT (r , r , 16 );
@@ -370,6 +384,30 @@ ssb_demod(int16_t *src, int16_t *dst, size_t len, int phasestep)
370384 disp_fetch_samples (B_PLAYBACK , BT_R_INTERLEAVE , dst , NULL , len );
371385}
372386
387+ void
388+ lsb_demod (int16_t * src , int16_t * dst , size_t len )
389+ {
390+ demod_weaver (src , dst , len , & lsb_demod_conf );
391+ }
392+
393+ void
394+ usb_demod (int16_t * src , int16_t * dst , size_t len )
395+ {
396+ demod_weaver (src , dst , len , & usb_demod_conf );
397+ }
398+
399+ void
400+ cw_demod (int16_t * src , int16_t * dst , size_t len )
401+ {
402+ weaver_demod_conf_t dc = {
403+ mode_freqoffset_phasestep , cw_tone_phasestep , & bq_cw_i , & bq_cw_q
404+ };
405+
406+ demod_weaver (src , dst , len , & dc );
407+ }
408+
409+
410+
373411__attribute__ ( ( always_inline ) ) __STATIC_INLINE
374412float _VSQRTF (float op1 ) {
375413 float result ;
383421am_demod (int16_t * src , int16_t * dst , size_t len )
384422#if defined(AM_FREQ_OFFSET ) && AM_FREQ_OFFSET
385423{
386- #define PHASESTEP 65536L*AM_FREQ_OFFSET/48000
387-
388424 q15_t * bufi = buffer [0 ];
389425 q15_t * bufq = buffer [1 ];
390426 int32_t * s = __SIMD32 (src );
@@ -395,7 +431,7 @@ am_demod(int16_t *src, int16_t *dst, size_t len)
395431
396432 for (i = 0 ; i < len /2 ; i ++ ) {
397433 uint32_t cossin = cos_sin (nco1_phase );
398- nco1_phase -= PHASESTEP ;
434+ nco1_phase -= mode_freqoffset_phasestep ;
399435 uint32_t iq = * s ++ ;
400436 * bufi ++ = __SMLSDX (iq , cossin , 0 ) >> (15 - 0 );
401437 * bufq ++ = __SMLAD (iq , cossin , 0 ) >> (15 - 0 );
@@ -446,66 +482,6 @@ am_demod(int16_t *src, int16_t *dst, size_t len)
446482}
447483#endif
448484
449- void
450- lsb_demod (int16_t * src , int16_t * dst , size_t len )
451- {
452- ssb_demod (src , dst , len , - SSB_NCO_PHASESTEP );
453- }
454-
455- void
456- usb_demod (int16_t * src , int16_t * dst , size_t len )
457- {
458- ssb_demod (src , dst , len , SSB_NCO_PHASESTEP );
459- }
460-
461-
462- int16_t cw_phasestep1 = 65536L * 10000 /48000 ;;
463- int16_t cw_phasestep2 = 65536L * 400 /48000 ;
464-
465- void
466- cw_demod (int16_t * src , int16_t * dst , size_t len )
467- {
468- q15_t * bufi = buffer [0 ];
469- q15_t * bufq = buffer [1 ];
470- int32_t * s = __SIMD32 (src );
471- int32_t * d = __SIMD32 (dst );
472- uint32_t i ;
473-
474- disp_fetch_samples (B_CAPTURE , BT_C_INTERLEAVE , src , NULL , len );
475-
476- // shift frequency
477- for (i = 0 ; i < len /2 ; i ++ ) {
478- uint32_t cossin = cos_sin (nco1_phase );
479- nco1_phase -= cw_phasestep1 ;
480- uint32_t iq = * s ++ ;
481- * bufi ++ = __SMLSDX (iq , cossin , 0 ) >> (15 - 0 );
482- * bufq ++ = __SMLAD (iq , cossin , 0 ) >> (15 - 0 );
483- }
484- disp_fetch_samples (B_IF1 , BT_IQ , buffer [0 ], buffer [1 ], len /2 );
485-
486- // apply low pass filter
487- arm_biquad_cascade_df1_q15 (& bq_cw_i , buffer [0 ], buffer2 [0 ], len /2 );
488- arm_biquad_cascade_df1_q15 (& bq_cw_q , buffer [1 ], buffer2 [1 ], len /2 );
489-
490- disp_fetch_samples (B_IF2 , BT_IQ , buffer2 [0 ], buffer2 [1 ], len /2 );
491-
492- // shift frequency inverse
493- bufi = buffer2 [0 ];
494- bufq = buffer2 [1 ];
495- for (i = 0 ; i < len /2 ; i ++ ) {
496- uint32_t cossin = cos_sin (nco2_phase );
497- nco2_phase -= cw_phasestep2 ;
498- uint32_t iq = __PKHBT (* bufi ++ , * bufq ++ , 16 );
499- uint32_t r = __SMLAD (iq , cossin , 0 ) >> (15 - 0 );
500- * d ++ = __PKHBT (r , r , 16 );
501- }
502-
503- disp_fetch_samples (B_PLAYBACK , BT_R_INTERLEAVE , dst , NULL , len );
504- }
505-
506-
507-
508-
509485
510486
511487struct {
0 commit comments