Added CW tone same as CW offset.

experimental
guido 2020-04-29 16:34:44 +02:00
rodzic 22f3831c2a
commit 80e0d60ebc
2 zmienionych plików z 50 dodań i 9 usunięć

Wyświetl plik

@ -1301,14 +1301,15 @@ void dsp_tx()
}
volatile uint16_t acc;
volatile uint32_t cw_offset = 700;
volatile uint32_t cw_offset;
volatile int16_t p_sin = 0; // initialized with A*sin(0) = 0
volatile int16_t n_cos = 448/2; // initialized with A*cos(t) = A
inline void process_minsky() // Minsky circle sample [source: https://www.cl.cam.ac.uk/~am21/hakmemc.html, ITEM 149]: p_sin+=n_cos*2*PI*f/fs; n_cos-=p_sin*2*PI*f/fs;
{
p_sin += 3*n_cos/4; // sine at 0.75*F_SAMP/6.28 = 574 Hz = cw_offset
n_cos -= 3*p_sin/4;
uint8_t alpha100 = cw_offset * 628 / F_SAMP_TX; // alpha = f_tone * 6.28 / fs
p_sin += alpha100 * n_cos / 100;
n_cos -= alpha100 * p_sin / 100;
}
void dummy()
@ -1544,10 +1545,50 @@ inline int16_t filt_var(int16_t za0) //filters build with www.micromodeler.com
return zc0;
}
inline int16_t filt_var_cw(int32_t za0) //filters build with www.micromodeler.com
inline int16_t filt_var_cw(int16_t za0) //filters build with www.micromodeler.com
{ // (2nd Order (SR=4465kHz) IIR in Direct Form I, 8x8:16), adding 64x front-gain,
static int16_t za1,za2;
static int16_t zb0,zb1,zb2;
switch(filt){
//case 4: zb0=(5*za0+9*za1+5*za2)+(30L*zb1-38L*zb2)/64; break; //720Hz+-250Hz
//case 5: zb0=(2*za0+4*za1+2*za2)+(51L*zb1-52L*zb2)/64; break; //720Hz+-100Hz
//case 6: zb0=(1*za0+2*za1+1*za2)+(59L*zb1-58L*zb2)/64; break; //720Hz+-50Hz
//case 7: zb0=(0*za0+1*za1+0*za2)+(66L*zb1-61L*zb2)/64; break; //720Hz+-25Hz
case 4: zb0=(za0+2*za1+za2)/2+(41L*zb1-23L*zb2)/32; break; //500-1000Hz
case 5: zb0=5*(za0-2*za1+za2)+(105L*zb1-58L*zb2)/64; break; //650-840Hz
case 6: zb0=3*(za0-2*za1+za2)+(108L*zb1-61L*zb2)/64; break; //650-750Hz
case 7: zb0=(2*za0-3*za1+2*za2)+(111L*zb1-62L*zb2)/64; break; //630-680Hz
}
static int16_t zc0,zc1,zc2;
switch(filt){
//case 4: zc0=(zb0-2*zb1+zb2)/4+(76L*zc1-44L*zc2)/64; break; //720Hz+-250Hz
//case 5: zc0=(zb0-2*zb1+zb2)/8+(72L*zc1-53L*zc2)/64; break; //720Hz+-100Hz
//case 6: zc0=(zb0-2*zb1+zb2)/16+(70L*zc1-58L*zc2)/64; break; //720Hz+-50Hz
//case 7: zc0=(zb0-2*zb1+zb2)/32+(70L*zc1-62L*zc2)/64; break; //720Hz+-25Hz
case 4: zc0=(zb0-2*zb1+zb2)/4+(105L*zc1-52L*zc2)/64; break; //500-1000Hz
case 5: zc0=((zb0+2*zb1+zb2)+97L*zc1-57L*zc2)/64; break; //650-840Hz
case 6: zc0=((zb0+zb1+zb2)+104L*zc1-60L*zc2)/64; break; //650-750Hz
case 7: zc0=((zb1)+109L*zc1-62L*zc2)/64; break; //630-680Hz
}
zc2=zc1;
zc1=zc0;
zb2=zb1;
zb1=zb0;
za2=za1;
za1=za0;
return zc0 / 64;
}
/*inline int16_t filt_var_cw(int32_t za0) //filters build with www.micromodeler.com
{
static int32_t za1,za2;
za0 <<= 6;
za0 *= 64;
// 4th Order (SR=8kHz) IIR in Direct Form I, 8x8:16
static int32_t zb0,zb1,zb2;
@ -1575,8 +1616,8 @@ inline int16_t filt_var_cw(int32_t za0) //filters build with www.micromodeler.c
za2=za1;
za1=za0;
return zc0 >> 6;
}
return zc0 / 64;
}*/
static uint32_t absavg256 = 0;
volatile uint32_t _absavg256 = 0;
@ -2699,7 +2740,7 @@ void setup()
drive = 4; // Init settings
if(!ssb_cap){ mode = CW; filt = 4; stepsize = STEP_500; }
if(dsp_cap != SDR) pwm_max = 255; // implies that key-shaping circuit is probably present, so use full-scale
if(dsp_cap) cw_offset = 600;
if(dsp_cap) cw_offset = 325; else cw_offset = 700;
// Load parameters from EEPROM, reset to factory defaults when stored values are from a different version
paramAction(LOAD, VERS);

Wyświetl plik

@ -169,7 +169,7 @@ The following performance measurements were made with QCX-SSB R1.01, a modified
- Rüdiger Möller, HPSDR presentation by [DJ1MR], 2018. Transmitter architectures for high efficiency amplification
- [Arduino PWM]
- [Serial interface]
--->
-->
[Simple, fun and versatile]: ucx.png
[original schematic]: https://qrp-labs.com/images/qcx/HiRes.png