82 lines
2.9 KiB
C
82 lines
2.9 KiB
C
|
/* -*- 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
|
||
|
|