mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2024-12-13 11:44:31 +00:00
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:
commit
f7a5f2c437
@ -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"
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -42,11 +42,14 @@ 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 { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user