Starting to implement overlap-discard in the DSP code. I think maybe I've gotten it working, with a pretty large improvement in audio, but reception was so bad I had a hard time finding things to listen to to test it with. Also added the ability to switch mode (LSB & AM).
This commit is contained in:
parent
50fbaf3920
commit
9d045be4ce
1 changed files with 77 additions and 12 deletions
|
@ -60,10 +60,10 @@ uint16_t filterKernelLength = 100; //what's a good value? How does it relate to
|
||||||
|
|
||||||
uint16_t menuState = 0;
|
uint16_t menuState = 0;
|
||||||
uint16_t menuLastState = 1;
|
uint16_t menuLastState = 1;
|
||||||
uint16_t menuCount = 9;
|
uint16_t menuCount = 10;
|
||||||
uint32_t frequencyDialMultiplier = 1;
|
uint32_t frequencyDialMultiplier = 1;
|
||||||
|
|
||||||
long vfoAFrequency = 7058960;
|
long vfoAFrequency = 10001460;
|
||||||
long vfoALastFreq = 0;
|
long vfoALastFreq = 0;
|
||||||
int encoderPos, encoderLastPos;
|
int encoderPos, encoderLastPos;
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ void populateCoeficients(int bandwidth, int sideband, int offset)
|
||||||
fftFilterCoeficient[FFT_BUFFER_SIZE / 2] = 0;
|
fftFilterCoeficient[FFT_BUFFER_SIZE / 2] = 0;
|
||||||
fftFilterCoeficient[FFT_BUFFER_SIZE - 1] = 0;
|
fftFilterCoeficient[FFT_BUFFER_SIZE - 1] = 0;
|
||||||
|
|
||||||
return;
|
return; //Skipping all the later stuff doesn't seem to make a huge difference yet...
|
||||||
|
|
||||||
//2:
|
//2:
|
||||||
float x, y;
|
float x, y;
|
||||||
|
@ -307,6 +307,7 @@ int isFwd;
|
||||||
float samplesC[FFT_BUFFER_SIZE];
|
float samplesC[FFT_BUFFER_SIZE];
|
||||||
float samplesDisplay[FFT_BUFFER_SIZE];
|
float samplesDisplay[FFT_BUFFER_SIZE];
|
||||||
float samplesDemod[FFT_BUFFER_SIZE];
|
float samplesDemod[FFT_BUFFER_SIZE];
|
||||||
|
float samplesOverlap[100];
|
||||||
int sampleBankAReady = 0;
|
int sampleBankAReady = 0;
|
||||||
int sampleBankBReady = 0;
|
int sampleBankBReady = 0;
|
||||||
int sampleBankCReady = 0;
|
int sampleBankCReady = 0;
|
||||||
|
@ -346,6 +347,13 @@ int isFwd;
|
||||||
dac1SetValue(samplesB[sampleIndex*2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
dac1SetValue(samplesB[sampleIndex*2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
dac2SetValue(samplesB[sampleIndex*2+1] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
dac2SetValue(samplesB[sampleIndex*2+1] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if(sampleIndex > FFT_SIZE - filterKernelLength - 1)
|
||||||
|
{
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength))*2] = samplesA[sampleIndex*2];
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength)) * 2 +1] = samplesA[sampleIndex*2+1];
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -362,9 +370,16 @@ int isFwd;
|
||||||
// dac2SetValue(samplesC[sampleIndex*2+1] + samplesB[(FFT_SIZE - filterKernelLength)
|
// dac2SetValue(samplesC[sampleIndex*2+1] + samplesB[(FFT_SIZE - filterKernelLength)
|
||||||
// + sampleIndex * 2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
// + sampleIndex * 2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
// } else {
|
// } else {
|
||||||
dac1SetValue(samplesC[sampleIndex*2] / (agcLevel * agcScale) * 4096 * gain + 2048);
|
dac1SetValue(samplesC[sampleIndex*2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
dac2SetValue(samplesC[sampleIndex*2+1] / (agcLevel * agcScale) * 4096 * gain + 2048);
|
dac2SetValue(samplesC[sampleIndex*2+1] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if(sampleIndex > FFT_SIZE - filterKernelLength - 1)
|
||||||
|
{
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength))*2] = samplesB[sampleIndex*2];
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength)) * 2 +1] = samplesB[sampleIndex*2+1];
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -384,6 +399,13 @@ int isFwd;
|
||||||
dac1SetValue(samplesA[sampleIndex*2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
dac1SetValue(samplesA[sampleIndex*2] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
dac2SetValue(samplesA[sampleIndex*2+1] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
dac2SetValue(samplesA[sampleIndex*2+1] /*/ (agcLevel * agcScale)*/ * 4096 * gain + 2048);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if(sampleIndex > FFT_SIZE - filterKernelLength - 1)
|
||||||
|
{
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength))*2] = samplesC[sampleIndex*2];
|
||||||
|
samplesOverlap[(sampleIndex - (FFT_SIZE - filterKernelLength)) * 2 +1] = samplesC[sampleIndex*2+1];
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//dac1SetValue(outputSamplesA[sampleIndex*2]);
|
//dac1SetValue(outputSamplesA[sampleIndex*2]);
|
||||||
|
@ -391,10 +413,10 @@ int isFwd;
|
||||||
agcLevel = agcLevel * (1 - 0.0001);
|
agcLevel = agcLevel * (1 - 0.0001);
|
||||||
|
|
||||||
sampleIndex++;
|
sampleIndex++;
|
||||||
if(sampleIndex >= FFT_SIZE - filterKernelLength)
|
if(sampleIndex >= FFT_SIZE - (filterKernelLength/2))
|
||||||
{
|
{
|
||||||
sampleRun = 1;
|
sampleRun = 1;
|
||||||
sampleIndex = 0;
|
sampleIndex = filterKernelLength/2; //0;
|
||||||
switch(sampleBank)
|
switch(sampleBank)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -437,7 +459,8 @@ int isFwd;
|
||||||
void zeroSampleBank(float *samples)
|
void zeroSampleBank(float *samples)
|
||||||
{
|
{
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for(i = 0; i < FFT_BUFFER_SIZE; i++) samples[i] = 0;
|
for(i = 0; i < filterKernelLength; i++) samples[i] = samplesOverlap[i];
|
||||||
|
for(; i < FFT_BUFFER_SIZE; i++) samples[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -501,6 +524,7 @@ main(int argc, char* argv[])
|
||||||
Adafruit_GFX_setTextWrap(1);
|
Adafruit_GFX_setTextWrap(1);
|
||||||
Adafruit_GFX_setTextColor(ILI9340_WHITE, ILI9340_BLACK);
|
Adafruit_GFX_setTextColor(ILI9340_WHITE, ILI9340_BLACK);
|
||||||
char freqChar[14];
|
char freqChar[14];
|
||||||
|
char modeChar[3];
|
||||||
sprintf(&freqChar, "%8d", 28000000);
|
sprintf(&freqChar, "%8d", 28000000);
|
||||||
|
|
||||||
|
|
||||||
|
@ -652,14 +676,22 @@ main(int argc, char* argv[])
|
||||||
case 7: //Filter Lower
|
case 7: //Filter Lower
|
||||||
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
||||||
Adafruit_GFX_drawFastHLine(150, 179, 30, ILI9340_BLACK);
|
Adafruit_GFX_drawFastHLine(150, 179, 30, ILI9340_BLACK);
|
||||||
|
Adafruit_GFX_drawFastHLine(150, 199, 30, ILI9340_BLACK);
|
||||||
Adafruit_GFX_drawFastHLine(150, 159, 30, ILI9340_RED);
|
Adafruit_GFX_drawFastHLine(150, 159, 30, ILI9340_RED);
|
||||||
break;
|
break;
|
||||||
case 8: //Filter Upper
|
case 8: //Filter Upper
|
||||||
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
||||||
Adafruit_GFX_drawFastHLine(150, 159, 30, ILI9340_BLACK);
|
Adafruit_GFX_drawFastHLine(150, 159, 30, ILI9340_BLACK);
|
||||||
|
Adafruit_GFX_drawFastHLine(150, 199, 30, ILI9340_BLACK);
|
||||||
Adafruit_GFX_drawFastHLine(150, 179, 30, ILI9340_RED);
|
Adafruit_GFX_drawFastHLine(150, 179, 30, ILI9340_RED);
|
||||||
break;
|
break;
|
||||||
case 9: //Mode
|
case 9:
|
||||||
|
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
||||||
|
Adafruit_GFX_drawFastHLine(150, 159, 30, ILI9340_BLACK);
|
||||||
|
Adafruit_GFX_drawFastHLine(150, 179, 30, ILI9340_BLACK);
|
||||||
|
Adafruit_GFX_drawFastHLine(150, 199, 30, ILI9340_RED);
|
||||||
|
break;
|
||||||
|
//Mode
|
||||||
default:
|
default:
|
||||||
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
Adafruit_GFX_drawFastHLine(freqHOffset, freqVOffset + 25, 178, ILI9340_BLACK);
|
||||||
break;
|
break;
|
||||||
|
@ -743,6 +775,39 @@ main(int argc, char* argv[])
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 9: //Mode
|
case 9: //Mode
|
||||||
|
encoderPos = getPos();
|
||||||
|
if(encoderPos != encoderLastPos)
|
||||||
|
{
|
||||||
|
mode = (encoderLastPos - encoderPos) % 3;
|
||||||
|
Adafruit_GFX_setTextSize(1);
|
||||||
|
Adafruit_GFX_setCursor(150, 190);
|
||||||
|
int i;
|
||||||
|
//TODO: CHANGE THE FILTER SO IT MAKES SENSE!
|
||||||
|
//Right now all this does is turns the AM decoder on and off, I guess.
|
||||||
|
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case 0: //LSB
|
||||||
|
modeChar[0] = 'L';
|
||||||
|
modeChar[1] = 'S';
|
||||||
|
modeChar[2] = 'B';
|
||||||
|
break;
|
||||||
|
case 1: //USB
|
||||||
|
modeChar[0] = 'U';
|
||||||
|
modeChar[1] = 'S';
|
||||||
|
modeChar[2] = 'B';
|
||||||
|
break;
|
||||||
|
case 2: //AM
|
||||||
|
modeChar[0] = 'A';
|
||||||
|
modeChar[1] = 'M';
|
||||||
|
modeChar[2] = ' ';
|
||||||
|
}
|
||||||
|
for(i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
Adafruit_GFX_write(modeChar[i]);
|
||||||
|
}
|
||||||
|
Adafruit_GFX_setTextSize(3);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -971,7 +1036,7 @@ void processStream()
|
||||||
for(i = 0; i < FFT_SIZE; i++)
|
for(i = 0; i < FFT_SIZE; i++)
|
||||||
{
|
{
|
||||||
samplesA[i * 2] = samplesDemod[i];
|
samplesA[i * 2] = samplesDemod[i];
|
||||||
samplesA[i * 2 + 1] = 0; //samplesDemod[i];
|
samplesA[i * 2 + 1] = samplesDemod[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1002,7 +1067,7 @@ void processStream()
|
||||||
for(i = 0; i < FFT_SIZE; i++)
|
for(i = 0; i < FFT_SIZE; i++)
|
||||||
{
|
{
|
||||||
samplesB[i * 2] = samplesDemod[i];
|
samplesB[i * 2] = samplesDemod[i];
|
||||||
samplesB[i * 2 + 1] = 0; //samplesDemod[i];
|
samplesB[i * 2 + 1] = samplesDemod[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,7 +1100,7 @@ void processStream()
|
||||||
for(i = 0; i < FFT_SIZE; i++)
|
for(i = 0; i < FFT_SIZE; i++)
|
||||||
{
|
{
|
||||||
samplesC[i * 2] = samplesDemod[i];
|
samplesC[i * 2] = samplesDemod[i];
|
||||||
samplesC[i * 2 + 1] = 0; //samplesDemod[i];
|
samplesC[i * 2 + 1] = samplesDemod[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue