Merge pull request #946 from Brumi-2021/noise_Signal_Generator_LFSR_polynomial_of_16_32_bits

Leaving only 1 Noise signal generator GUI option , (the best one , using  LFSR polynomial of 16 bits)
This commit is contained in:
gullradriel 2023-05-03 13:57:06 +02:00 committed by GitHub
commit f7a5f2c437
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 41 deletions

View File

@ -48,29 +48,27 @@ private:
void update_tone(); void update_tone();
void on_tx_progress(const uint32_t progress, const bool done); void on_tx_progress(const uint32_t progress, const bool done);
const std::string shape_strings[9] = { const std::string shape_strings[7] = {
"CW ", "CW-just carrier",
"Sine ", "Sine signal ",
"Triangle ", "Triangle signal",
"Saw up ", "Saw up signal ",
"Saw down ", "Saw down signal",
"Square ", "Square signal ",
"Noise n20Khz", "Noise signal " // using 16 bits LFSR register, 16 order polynomial feedback.
"Noise n10khz",
"Noise n5khz "
}; };
bool auto_update { false }; bool auto_update { false };
Labels labels { Labels labels {
{ { 6 * 8, 4 + 10 }, "Shape:", Color::light_grey() }, { { 3 * 8, 4 + 10 }, "Shape:", Color::light_grey() },
{ { 7 * 8, 7 * 8 }, "Tone: Hz", Color::light_grey() }, { { 6 * 8, 7 * 8 }, "Tone: Hz", Color::light_grey() },
{ { 22 * 8, 15 * 8 + 4 }, "s.", Color::light_grey() }, { { 22 * 8, 15 * 8 + 4 }, "s.", Color::light_grey() },
{ { 8 * 8, 20 * 8 }, "Modulation: FM", Color::light_grey() } { { 8 * 8, 20 * 8 }, "Modulation: FM", Color::light_grey() }
}; };
ImageOptionsField options_shape { ImageOptionsField options_shape {
{ 13 * 8, 4, 32, 32 }, { 10 * 8, 4, 32, 32 },
Color::white(), Color::white(),
Color::black(), Color::black(),
{ {
@ -80,14 +78,12 @@ private:
{ &bitmap_sig_saw_up, 3 }, { &bitmap_sig_saw_up, 3 },
{ &bitmap_sig_saw_down, 4 }, { &bitmap_sig_saw_down, 4 },
{ &bitmap_sig_square, 5 }, { &bitmap_sig_square, 5 },
{ &bitmap_sig_noise, 6 }, { &bitmap_sig_noise, 6 }
{ &bitmap_sig_noise, 7 },
{ &bitmap_sig_noise, 8 }
} }
}; };
Text text_shape { Text text_shape {
{ 18 * 8, 4 + 10, 8 * 8, 16 }, { 15 * 8, 4 + 10, 8 * 8, 16 },
"" ""
}; };
@ -98,12 +94,12 @@ private:
}; };
Button button_update { Button button_update {
{ 6 * 8, 10 * 8, 8 * 8, 3 * 8 }, { 5 * 8, 10 * 8, 8 * 8, 3 * 8 },
"Update" "Update"
}; };
Checkbox checkbox_auto { Checkbox checkbox_auto {
{ 16 * 8, 10 * 8 }, { 15 * 8, 10 * 8 },
4, 4,
"Auto" "Auto"
}; };

View File

@ -61,23 +61,29 @@ void SigGenProcessor::execute(const buffer_c8_t& buffer) {
} else if (tone_shape == 5) { } else if (tone_shape == 5) {
// Square // Square
sample = (((tone_phase & 0xFF000000) >> 24) & 0x80) ? 127 : -128; sample = (((tone_phase & 0xFF000000) >> 24) & 0x80) ? 127 : -128;
} else if (tone_shape == 6) { // taps: 6 5; feedback polynomial: x^6 + x^5 + 1 , Periode 63 = 2^n-1,it generates armonincs n x 20Khz } else if (tone_shape == 6) {
// White Noise generator, pseudo random noise generator, 8 bits linear-feedback shift register (LFSR) algorithm, variant Fibonacci. // Noise generator, pseudo random noise generator, 16 bits linear-feedback shift register (LFSR) algorithm, variant Fibonacci.
// https://en.wikipedia.org/wiki/Linear-feedback_shift_register // https://en.wikipedia.org/wiki/Linear-feedback_shift_register
bit = ((lfsr >> 2) ^ (lfsr >> 3)) & 1; // 16 bits LFSR .taps: 16, 15, 13, 4 ;feedback polynomial: x^16 + x^15 + x^13 + x^4 + 1
lfsr = (lfsr >> 1) | (bit << 7); // Periode 65535= 2^n-1, quite continuous .
sample = lfsr; if (counter == 0) { // we slow down the shift register, because the pseudo random noise clock freq was too high for modulator.
} else if (tone_shape == 7) { // taps: 7 6; feedback polynomial: x^7 + x^6 + 1 , Periode 127 = 2^n-1,it generates armonincs n x 10Khz bit_16 = ((lfsr_16 >> 0) ^ (lfsr_16 >> 1) ^ (lfsr_16 >> 3) ^ (lfsr_16 >> 4) ^ (lfsr_16 >> 12) & 1);
bit = ((lfsr >> 1) ^ (lfsr >> 2)) & 1; lfsr_16 = (lfsr_16 >> 1) | (bit_16 << 15);
lfsr = (lfsr >> 1) | (bit << 7); sample = (lfsr_16 & 0x00FF); // main pseudo random noise generator.
sample = lfsr; }
} else if (tone_shape == 8) { //taps:8,6,5,4;feedback polynomial: x^8 + x^6 + x^5 + x^4 + 1,Periode 255= 2^n-1, armonics n x 5khz if (counter == 5) { // after many empiric test, that combination mix of >>4 and >>5, gives a reasonable trade off white noise / good rf power level .
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1; sample = ((lfsr_16 & 0b0000111111110000) >> 4); // just changing the spectrum shape .
lfsr = (lfsr >> 1) | (bit << 7); }
sample = lfsr; if (counter == 10) {
sample = ((lfsr_16 & 0b0001111111100000) >> 5); // just changing the spectrum shape .
}
counter++;
if (counter ==15) {
counter=0;
}
} }
if (tone_shape < 6) { if (tone_shape < 6) { // we are in periodic signals, we need tone phases update.
tone_phase += tone_delta; tone_phase += tone_delta;
} }
@ -114,8 +120,8 @@ void SigGenProcessor::on_message(const Message* const msg) {
fm_delta = message.bw * (0xFFFFFFULL / 1536000); fm_delta = message.bw * (0xFFFFFFULL / 1536000);
tone_shape = message.shape; tone_shape = message.shape;
// lfsr = 0x54DF0119; // lfsr = seed_value ; // Finally not used , init lfsr 8 bits.
lfsr = seed_value ; lfsr_16 = seed_value_16; // init lfsr 16 bits.
configured = true; configured = true;
break; break;

View File

@ -42,10 +42,13 @@ private:
uint8_t tone_shape { }; uint8_t tone_shape { };
uint32_t sample_count { 0 }; uint32_t sample_count { 0 };
bool auto_off { }; bool auto_off { };
int32_t phase { 0 }, sphase { 0 }, delta { 0 }; // they may have sign . int32_t phase { 0 }, sphase { 0 }, delta { 0 }; // they may have sign in the pseudo random sample generation.
int8_t sample { 0 }, re { 0 }, im { 0 }; // they may have sign . int8_t sample { 0 }, re { 0 }, im { 0 }; // they have sign + and -.
uint8_t seed_value = {0x56}; // seed : any nonzero start state will work. uint16_t seed_value_16 = {0xACE1}; // seed 16 bits lfsr : any nonzero start state will work.
uint8_t lfsr { }, bit { }; // bit must be 8-bit to allow bit<<7 later in the code */ uint16_t lfsr_16 { }, bit_16 { }; // bit must be 16-bit to allow bit<<15 later in the code */
uint8_t counter {0};
// uint8_t seed_value = {0x56}; // Finally not used lfsr of 8 bits , seed 8blfsr : any nonzero start state will work.
// uint8_t lfsr { }, bit { }; // Finally not used lfsr of 8 bits , bit must be 8-bit to allow bit<<7 later in the code */
TXProgressMessage txprogress_message { }; TXProgressMessage txprogress_message { };
}; };