first commit
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
|
||||
/************************************************************************************
|
||||
** **
|
||||
** mcHF QRP Transceiver **
|
||||
** K Atanassov - M0NKA 2014 **
|
||||
** **
|
||||
**---------------------------------------------------------------------------------**
|
||||
** **
|
||||
** File name: **
|
||||
** Description: **
|
||||
** Last Modified: **
|
||||
** Licence: GNU GPLv3 **
|
||||
************************************************************************************/
|
||||
|
||||
#include "uhsdr_types.h"
|
||||
#include "dds_table.h"
|
||||
|
||||
// this table represents 2*PI, i.e. a full sine wave
|
||||
const int16_t DDS_TABLE[DDS_TBL_SIZE] =
|
||||
{
|
||||
|
||||
// 1024 points
|
||||
0,
|
||||
201, 402, 603, 804, 1005, 1206, 1406, 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011,
|
||||
3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608, 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195,
|
||||
6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766, 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319,
|
||||
9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849, 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353,
|
||||
12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827, 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268,
|
||||
15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672, 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036,
|
||||
18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357, 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631,
|
||||
20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855, 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027,
|
||||
23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143, 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201,
|
||||
25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198, 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132,
|
||||
27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001, 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802,
|
||||
28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534, 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195,
|
||||
30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783, 30851, 30918, 30984, 31049, 31113, 31175, 31236, 31297,
|
||||
31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735, 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097,
|
||||
32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382, 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588,
|
||||
32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717, 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766,
|
||||
32766, 32766, 32764, 32761, 32757, 32751, 32744, 32736, 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628,
|
||||
32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441, 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176,
|
||||
32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833, 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413,
|
||||
31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918, 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349,
|
||||
30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706, 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992,
|
||||
28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208, 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355,
|
||||
27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437, 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456,
|
||||
25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413, 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311,
|
||||
23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153, 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942,
|
||||
20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680, 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371,
|
||||
18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017, 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623,
|
||||
15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191, 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724,
|
||||
12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227, 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703,
|
||||
9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156, 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589,
|
||||
6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006, 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411,
|
||||
3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808, 1607, 1406, 1206, 1005, 804, 603, 402, 201,
|
||||
0,
|
||||
-201, -402, -603, -804, -1005, -1206, -1406, -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011,
|
||||
-3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608, -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195,
|
||||
-6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766, -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319,
|
||||
-9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849, -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
|
||||
-12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827, -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
|
||||
-15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672, -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
|
||||
-18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357, -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
|
||||
-20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855, -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
|
||||
-23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143, -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
|
||||
-25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198, -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
|
||||
-27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001, -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
|
||||
-28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534, -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
|
||||
-30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783, -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
|
||||
-31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735, -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
|
||||
-32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382, -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
|
||||
-32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717, -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
|
||||
-32766, -32766, -32764, -32761, -32757, -32751, -32744, -32736, -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628,
|
||||
-32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441, -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176,
|
||||
-32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833, -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413,
|
||||
-31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918, -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349,
|
||||
-30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706, -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992,
|
||||
-28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208, -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355,
|
||||
-27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437, -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456,
|
||||
-25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413, -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311,
|
||||
-23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153, -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942,
|
||||
-20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680, -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371,
|
||||
-18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017, -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623,
|
||||
-15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191, -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724,
|
||||
-12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227, -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703,
|
||||
-9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156, -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589,
|
||||
-6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006, -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411,
|
||||
-3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808, -1607, -1406, -1206, -1005, -804, -603, -402, -201
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
|
||||
/************************************************************************************
|
||||
** **
|
||||
** mcHF QRP Transceiver **
|
||||
** K Atanassov - M0NKA 2014 **
|
||||
** **
|
||||
**---------------------------------------------------------------------------------**
|
||||
** **
|
||||
** File name: **
|
||||
** Description: **
|
||||
** Last Modified: **
|
||||
** Licence: GNU GPLv3 **
|
||||
************************************************************************************/
|
||||
|
||||
#ifndef __DDS_TABLE_H
|
||||
#define __DDS_TABLE_H
|
||||
|
||||
|
||||
#define DDS_TBL_BITS 10
|
||||
#define DDS_TBL_SIZE (1 << DDS_TBL_BITS) // 10 = 1024
|
||||
|
||||
extern const int16_t DDS_TABLE[DDS_TBL_SIZE];
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,157 @@
|
||||
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
|
||||
/************************************************************************************
|
||||
** **
|
||||
** mcHF QRP Transceiver **
|
||||
** K Atanassov - M0NKA 2014 **
|
||||
** **
|
||||
**---------------------------------------------------------------------------------**
|
||||
** **
|
||||
** File name: **
|
||||
** Description: **
|
||||
** Last Modified: **
|
||||
** Licence: GNU GPLv3 **
|
||||
************************************************************************************/
|
||||
|
||||
// Credits - SDR cube!!!
|
||||
|
||||
// Common
|
||||
#include "uhsdr_board.h"
|
||||
#include "dds_table.h"
|
||||
#include "softdds.h"
|
||||
|
||||
|
||||
// Two Tone Dds
|
||||
soft_dds_t dbldds[2];
|
||||
|
||||
uint32_t softdds_stepForSampleRate(float32_t freq, uint32_t samp_rate)
|
||||
{
|
||||
uint64_t freq64_shifted = freq * DDS_TBL_SIZE;
|
||||
freq64_shifted <<= SOFTDDS_ACC_SHIFT;
|
||||
uint64_t step = freq64_shifted / samp_rate;
|
||||
return step;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize softdds for given frequency and sample rate
|
||||
*/
|
||||
void softdds_setFreqDDS(soft_dds_t* softdds_p, float32_t freq, uint32_t samp_rate,uint8_t smooth)
|
||||
{
|
||||
// Reset accumulator, if need smooth tone
|
||||
// transition, do not reset it (e.g. wspr)
|
||||
if(smooth == false)
|
||||
{
|
||||
softdds_p->acc = 0;
|
||||
}
|
||||
// Calculate new step
|
||||
softdds_p->step = softdds_stepForSampleRate(freq,samp_rate);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize softdds for given frequency and sample rate
|
||||
*/
|
||||
|
||||
void softdds_configRunIQ(float freq[2],uint32_t samp_rate,uint8_t smooth)
|
||||
{
|
||||
softdds_setFreqDDS(&dbldds[0],freq[0],samp_rate,smooth);
|
||||
softdds_setFreqDDS(&dbldds[1],freq[1],samp_rate,smooth);
|
||||
}
|
||||
|
||||
void softdds_genIQSingleTone(soft_dds_t* dds, float32_t *i_buff,float32_t *q_buff,uint16_t size)
|
||||
{
|
||||
for(uint16_t i = 0; i < size; i++)
|
||||
{
|
||||
// Calculate next sample
|
||||
uint32_t k = softdds_nextSampleIndex(dds);
|
||||
|
||||
// Load I value (sin)
|
||||
*i_buff = DDS_TABLE[k];
|
||||
|
||||
// -90 degrees shift (cos)
|
||||
// Load Q value
|
||||
*q_buff = DDS_TABLE[softdds_phase_shift90(k)];
|
||||
|
||||
// Next ptr
|
||||
i_buff++;
|
||||
q_buff++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Generates the addition of two sinus frequencies as IQ data stream
|
||||
* min/max value is +/-2^15-1
|
||||
* Frequencies need to be configured using softdds_setfreq_dbl
|
||||
*/
|
||||
void softdds_genIQTwoTone(soft_dds_t* ddsA, soft_dds_t* ddsB, float *i_buff,float *q_buff,ushort size)
|
||||
{
|
||||
for(int i = 0; i < size; i++)
|
||||
{
|
||||
uint32_t k[2];
|
||||
// Calculate next sample
|
||||
k[0] = softdds_nextSampleIndex(ddsA);
|
||||
k[1] = softdds_nextSampleIndex(ddsB);
|
||||
|
||||
// Load I value 0.5*(sin(a)+sin(b))
|
||||
*i_buff = ((int32_t)DDS_TABLE[k[0]] + (int32_t)DDS_TABLE[k[1]])/2;
|
||||
|
||||
*q_buff = ((int32_t)DDS_TABLE[softdds_phase_shift90(k[0])] + (int32_t)DDS_TABLE[softdds_phase_shift90(k[1])])/2;
|
||||
|
||||
// Next ptr
|
||||
i_buff++;
|
||||
q_buff++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overlays an audio stream with a beep signal
|
||||
* @param dds The previously initialized dds configuration
|
||||
* @param buffer audio buffer of blockSize (mono/single channel) samples
|
||||
* @param blockSize
|
||||
* @param scaling scale the resulting sine wave with this factor
|
||||
*/
|
||||
|
||||
void softdds_addSingleTone(soft_dds_t* dds_ptr, float32_t* buffer, const size_t blockSize, float32_t scaling)
|
||||
{
|
||||
for(int i=0; i < blockSize; i++) // transfer to DMA buffer and do conversion to INT
|
||||
{
|
||||
buffer[i] += (float32_t)softdds_nextSample(dds_ptr) * scaling; // load indexed sine wave value, adding it to audio, scaling the amplitude and putting it on "b" - speaker (ONLY)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overlays an audio stream with a beep signal
|
||||
* @param dds The previously initialized dds configuration
|
||||
* @param buffer1 audio buffer of blockSize (mono/single channel) samples
|
||||
* @param buffer2 audio buffer of blockSize (mono/single channel) samples
|
||||
* @param blockSize
|
||||
* @param scaling scale the resulting sine wave with this factor
|
||||
*/
|
||||
|
||||
void softdds_addSingleToneToTwobuffers(soft_dds_t* dds_ptr, float32_t* buffer1, float32_t* buffer2, const size_t blockSize, float32_t scaling)
|
||||
{
|
||||
float32_t Tone;
|
||||
for(int i=0; i < blockSize; i++) // transfer to DMA buffer and do conversion to INT
|
||||
{
|
||||
Tone=(float32_t) softdds_nextSample(dds_ptr) * scaling; // load indexed sine wave value, adding it to audio, scaling the amplitude and putting it on "b" - speaker (ONLY)
|
||||
buffer1[i] += Tone;
|
||||
buffer2[i] += Tone;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Generates the sinus frequencies as IQ data stream
|
||||
* min/max value is +/-2^15-1
|
||||
* Frequency needs to be configured using softdds_setfreq
|
||||
*/
|
||||
void softdds_runIQ(float32_t *i_buff,float32_t *q_buff,uint16_t size)
|
||||
{
|
||||
if (dbldds[1].step>0.0)
|
||||
{
|
||||
softdds_genIQTwoTone(&dbldds[0], &dbldds[1], i_buff, q_buff,size);
|
||||
}
|
||||
else
|
||||
{
|
||||
softdds_genIQSingleTone(&dbldds[0],i_buff,q_buff,size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
|
||||
/************************************************************************************
|
||||
** **
|
||||
** mcHF QRP Transceiver **
|
||||
** K Atanassov - M0NKA 2014 **
|
||||
** **
|
||||
**---------------------------------------------------------------------------------**
|
||||
** **
|
||||
** File name: **
|
||||
** Description: **
|
||||
** Last Modified: **
|
||||
** Licence: GNU GPLv3 **
|
||||
************************************************************************************/
|
||||
|
||||
#ifndef __SOFTDDS_H
|
||||
#define __SOFTDDS_H
|
||||
|
||||
#include "dds_table.h"
|
||||
|
||||
// we use a 32 bit accumulator
|
||||
#define SOFTDDS_ACC_SHIFT (32-DDS_TBL_BITS)
|
||||
|
||||
// Soft DDS public structure
|
||||
typedef struct
|
||||
{
|
||||
// DDS accumulator
|
||||
uint32_t acc;
|
||||
|
||||
// DDS step - not working if part of the structure
|
||||
uint32_t step;
|
||||
} soft_dds_t;
|
||||
|
||||
|
||||
/**
|
||||
* Execute a single step in the sinus generation
|
||||
*/
|
||||
inline uint32_t softdds_nextSampleIndex(soft_dds_t* dds)
|
||||
{
|
||||
uint32_t retval = (dds->acc >> SOFTDDS_ACC_SHIFT)%DDS_TBL_SIZE;
|
||||
|
||||
dds->acc += dds->step;
|
||||
|
||||
// now scale down precision and make sure that
|
||||
// index wraps around properly
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the index which represents a -90 degree shift compared to
|
||||
* k, i.e. get k = sin(a) => cos(a)
|
||||
*/
|
||||
inline uint32_t softdds_phase_shift90(uint32_t k)
|
||||
{
|
||||
// make sure that
|
||||
// index wraps around properly
|
||||
return (k+(3*DDS_TBL_SIZE/4))%DDS_TBL_SIZE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Execute a single step in the sinus generation and return actual sample value
|
||||
*/
|
||||
inline int16_t softdds_nextSample(soft_dds_t* dds)
|
||||
{
|
||||
return DDS_TABLE[softdds_nextSampleIndex(dds)];
|
||||
}
|
||||
|
||||
|
||||
void softdds_setFreqDDS(soft_dds_t* dds, float32_t freq, uint32_t samp_rate, uint8_t smooth);
|
||||
void softdds_genIQSingleTone(soft_dds_t* dds, float32_t *i_buff,float32_t *q_buff,uint16_t size);
|
||||
void softdds_genIQTwoTone(soft_dds_t* ddsA, soft_dds_t* ddsB, float *i_buff,float *q_buff,ushort size);
|
||||
|
||||
void softdds_addSingleTone(soft_dds_t* dds_ptr, float32_t* buffer, const size_t blockSize, float32_t scaling);
|
||||
void softdds_addSingleToneToTwobuffers(soft_dds_t* dds_ptr, float32_t* buffer1, float32_t* buffer2, const size_t blockSize, float32_t scaling);
|
||||
|
||||
void softdds_runIQ(float32_t *i_buff, float32_t *q_buff, uint16_t size);
|
||||
void softdds_configRunIQ(float32_t freq[2],uint32_t samp_rate,uint8_t smooth);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user