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:
Michael Colton 2014-07-21 08:50:38 -06:00
parent 50fbaf3920
commit 9d045be4ce

View file

@ -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];
} }
} }