diff --git a/STM32/Core/Src/fft.c b/STM32/Core/Src/fft.c index 208befd..4fe7e4d 100644 --- a/STM32/Core/Src/fft.c +++ b/STM32/Core/Src/fft.c @@ -266,49 +266,6 @@ void FFT_bufferPrepare(void) dc_filter(FFTInput_I_current, FFT_SIZE, DC_FILTER_FFT_I); dc_filter(FFTInput_Q_current, FFT_SIZE, DC_FILTER_FFT_Q); } - //----------------------------------------------------------------------------------------------------------------------------------------- - //FFT Peaks - if(TRX.FFT_HoldPeaks) - { - uint32_t fft_y_prev = 0; - for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) - { - uint32_t fft_y = LAY_WTF_HEIGHT - fft_peaks[fft_x]; - int32_t y_diff = (int32_t)fft_y - (int32_t)fft_y_prev; - if (fft_x == 0 || (y_diff <= 1 && y_diff >= -1)) - { - fft_output_buffer[fft_y][fft_x] = palette_fft[LAY_WTF_HEIGHT / 2]; - } - else - { - for (uint32_t l = 0; l < (abs(y_diff / 2) + 1); l++) //draw line - { - fft_output_buffer[fft_y_prev + ((y_diff > 0) ? l : -l)][fft_x - 1] = palette_fft[LAY_WTF_HEIGHT / 2]; - fft_output_buffer[fft_y + ((y_diff > 0) ? -l : l)][fft_x] = palette_fft[LAY_WTF_HEIGHT / 2]; - } - } - fft_y_prev = fft_y; - } - } -//----------------------------------------------------------------------------------------------------------------------------------------- - //FFT Peaks - if(TRX.FFT_HoldPeaks) - { - if(lastWTFFreq == currentFFTFreq) - { - for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) - if(fft_peaks[fft_x] <= fft_header[fft_x]) - fft_peaks[fft_x] = fft_header[fft_x]; - else if(fft_peaks[fft_x] > 0) - fft_peaks[fft_x]--; - } - else - { - for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) - fft_peaks[fft_x] = fft_header[fft_x]; - } - } - //----------------------------------------------------------------------------------------------------------------------------------------- //ZoomFFT if (TRX.FFT_Zoom > 1) @@ -545,12 +502,8 @@ bool FFT_printFFT(void) // calculate the colors for the waterfall for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) { - height = (uint16_t)((float32_t)FFTOutput_mean[(uint_fast16_t)fft_x] * LAY_FFT_HEIGHT); -// if(height < 10) -// height = 0; - if (height > LAY_FFT_HEIGHT) height = LAY_FFT_HEIGHT; @@ -558,12 +511,52 @@ bool FFT_printFFT(void) fft_header[fft_x] = height; indexed_wtf_buffer[0][fft_x] = LAY_FFT_HEIGHT - height; -// if(indexed_wtf_buffer[0][fft_x] < 5) -// indexed_wtf_buffer[0][fft_x] = 0; - if (fft_x == (LAY_FFT_PRINT_SIZE / 2)) continue; } + + //FFT Peaks + if (TRX.FFT_HoldPeaks) + { + //peaks moving + if (lastWTFFreq != currentFFTFreq) + { + float32_t diff = (float32_t)currentFFTFreq - (float32_t)lastWTFFreq; + diff = diff / (float32_t)(FFT_HZ_IN_PIXEL * TRX.FFT_Zoom); + diff = roundf(diff); + + if (diff > 0) + { + for (int32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) + { + int32_t new_x = fft_x + (int32_t)diff; + if (new_x >= 0 && new_x < LAY_FFT_PRINT_SIZE) + fft_peaks[fft_x] = fft_peaks[new_x]; + else + fft_peaks[fft_x] = 0; + } + } + else if (diff < 0) + { + for (int32_t fft_x = LAY_FFT_PRINT_SIZE - 1; fft_x >= 0; fft_x--) + { + int32_t new_x = fft_x + (int32_t)diff; + if (new_x >= 0 && new_x < LAY_FFT_PRINT_SIZE) + fft_peaks[fft_x] = fft_peaks[new_x]; + else + fft_peaks[fft_x] = 0; + } + } + } + //peaks falling + for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) + { + if (fft_peaks[fft_x] <= fft_header[fft_x]) + fft_peaks[fft_x] = fft_header[fft_x]; + else if (fft_peaks[fft_x] > 0) + fft_peaks[fft_x]--; + } + } // calculate bw bar size switch (CurrentVFO()->Mode) @@ -627,6 +620,30 @@ bool FFT_printFFT(void) } } } + + //FFT Peaks + if (TRX.FFT_HoldPeaks) + { + uint32_t fft_y_prev = 0; + for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++) + { + uint32_t fft_y = LAY_FFT_HEIGHT - fft_peaks[fft_x]; + int32_t y_diff = (int32_t)fft_y - (int32_t)fft_y_prev; + if (fft_x == 0 || (y_diff <= 1 && y_diff >= -1)) + { + fft_output_buffer[fft_y][fft_x] = palette_fft[LAY_FFT_HEIGHT / 2]; + } + else + { + for (uint32_t l = 0; l < (abs(y_diff / 2) + 1); l++) //draw line + { + fft_output_buffer[fft_y_prev + ((y_diff > 0) ? l : -l)][fft_x - 1] = palette_fft[LAY_FFT_HEIGHT / 2]; + fft_output_buffer[fft_y + ((y_diff > 0) ? -l : l)][fft_x] = palette_fft[LAY_FFT_HEIGHT / 2]; + } + } + fft_y_prev = fft_y; + } + } //draw grids if (TRX.FFT_Grid == 1 || TRX.FFT_Grid == 2) diff --git a/STM32/Core/Src/system_menu.c b/STM32/Core/Src/system_menu.c index ef4417e..7f859d2 100644 --- a/STM32/Core/Src/system_menu.c +++ b/STM32/Core/Src/system_menu.c @@ -244,7 +244,7 @@ static const struct sysmenu_item_handler sysmenu_screen_handlers[] = {"7.FFT Compressor", SYSMENU_BOOLEAN, (uint32_t *)&TRX.FFT_Compressor, SYSMENU_HANDL_SCREEN_FFT_Compressor}, {"8.FFT Averaging", SYSMENU_UINT8, (uint32_t *)&TRX.FFT_Averaging, SYSMENU_HANDL_SCREEN_FFT_Averaging}, {"9.FFT Window", SYSMENU_UINT8, (uint32_t *)&TRX.FFT_Window, SYSMENU_HANDL_SCREEN_FFT_Window}, - //{"FFT Hold Peaks", SYSMENU_BOOLEAN, (uint32_t *)&TRX.FFT_HoldPeaks, SYSMENU_HANDL_SCREEN_FFT_HoldPeaks}, + {"10.FFT Hold Peaks", SYSMENU_BOOLEAN, (uint32_t *)&TRX.FFT_HoldPeaks, SYSMENU_HANDL_SCREEN_FFT_HoldPeaks}, }; static const uint8_t sysmenu_screen_item_count = sizeof(sysmenu_screen_handlers) / sizeof(sysmenu_screen_handlers[0]);