Giter VIP home page Giter VIP logo

dspham's People

Contributors

grahamwhaley avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

dspham's Issues

Decimate audio to improve NR

Some of the NR reduction algos, such as the Spectral (possibly the best one), work on 'bins', splitting the audio into 'bins' and then selecting which ones have audio in them or not etc.
Currently (v1.0) we run the audio path at a full 44kHz sample rate, which is 'wasteful', as we are normally only interested in the audio part, which is probably upto 3.5kHz max.

If we decimate the audio path by 4, that takes us down to ~11kHz, so an audio bandwidth of ~5.5kHz. That will still leave us with plenty of 'space' for normal audio, and even an OK bandwidth for AM SWL. It will hopefully allow the NR systems to 'focus' more finely on the actual audio, and thus hopefully do an even better job of sorting out the noise from the useful sounds.

Try it out...

k4icy decoder: improve 'special' character decoding

The k4icy CW decoder has some of the decode characters commented out in the code, such as here:

  //if (strcmp(elementSequence,"-...-") == 0)   { decodeChar = 61; }  // = (Pause, BT)

Now my CW 'ear' is getting better, I've started to notice these :-). It's not clear why they are commented out - it looks to be that way in the original code as well.

= was the one I noticed 'live', and the above code visually looks right to me - there is an = in the 2x16 LCD character set, and it is 61 (0xd3).

First step then, uncomment the = line above, and see if we get a correct decode for -...-
If that works, move on to see what else is commented out and if there is a sensible way to instate those on the 2x16 charset.

My gut was telling me maybe there was a disparity between the 2x16 charset and ascii, but looking at an ascii chart, = is indeed 61 - so maybe that theory does not wash...

Compiling DSPham.ini

Hello Graham,
Very interested in your Radcom article as I have been trying to improve the audio on my IC7300 to get rid of some of noise on the output. I am not a programmer so could do with a bit of help if that is possible.
I am trying to compile DSPham.ino but it fails every time. I believe I have all the necessary files within my arduino IDE but it always comes back with an error as below where it cannot find global.h
Any help would be much appreciated.
Rod G0IYQ

Arduino: 1.8.13 (Windows 10), TD: 1.53, Board: "Teensy 4.0, Serial, 600 MHz, Faster, US English"

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\rodmi\Documents\Arduino\libraries -fqbn=teensy:avr:teensy40:usb=serial,speed=600,opt=o2std,keys=en-us -ide-version=10813 -build-path C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171 -warnings=none -build-cache C:\Users\rodmi\AppData\Local\Temp\arduino_cache_775077 -verbose C:\Users\rodmi\AppData\Local\Temp\untitled2054921278.tmp\sketch_feb18a\sketch_feb18a.ino

C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\rodmi\Documents\Arduino\libraries -fqbn=teensy:avr:teensy40:usb=serial,speed=600,opt=o2std,keys=en-us -ide-version=10813 -build-path C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171 -warnings=none -build-cache C:\Users\rodmi\AppData\Local\Temp\arduino_cache_775077 -verbose C:\Users\rodmi\AppData\Local\Temp\untitled2054921278.tmp\sketch_feb18a\sketch_feb18a.ino

Using board 'teensy40' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr

Using core 'teensy4' from platform in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr

Detecting libraries used...

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for Audio.h: [[email protected]]

ResolveLibrary(Audio.h)

-> candidates: [[email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for SPI.h: [[email protected]]

ResolveLibrary(SPI.h)

-> candidates: [[email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for SD.h: [[email protected] [email protected]]

ResolveLibrary(SD.h)

-> candidates: [[email protected] [email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for SerialFlash.h: [[email protected]]

ResolveLibrary(SerialFlash.h)

-> candidates: [[email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SerialFlash" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for Wire.h: [[email protected]]

ResolveLibrary(Wire.h)

-> candidates: [[email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SerialFlash" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for Encoder.h: [[email protected]]

ResolveLibrary(Encoder.h)

-> candidates: [[email protected]]

"C:\Program Files (x86)\Arduino\hardware\teensy/../tools/arm/bin/arm-none-eabi-g++" -E -CC -x c++ -w -g -Wall -ffunction-sections -fdata-sections -nostdlib -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -D__IMXRT1062__ -DTEENSYDUINO=153 -DARDUINO=10813 -DARDUINO_TEENSY40 -DF_CPU=600000000 -DUSB_SERIAL -DLAYOUT_US_ENGLISH "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy4" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SerialFlash" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire" "-IC:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Encoder" "C:\Users\rodmi\AppData\Local\Temp\arduino_build_958171\sketch\sketch_feb18a.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for global.h: []

ResolveLibrary(global.h)C:\Users\rodmi\AppData\Local\Temp\untitled2054921278.tmp\sketch_feb18a\DSPham.ino:7:20: fatal error: global.h: No such file or directory

-> candidates: []

compilation terminated.

Multiple libraries were found for "SD.h"

Used: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD

Not used: C:\Program Files (x86)\Arduino\libraries\SD

Using library Audio at version 1.3 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Audio

Using library SPI at version 1.0 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SPI

Using library SD at version 1.2.2 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SD

Using library SerialFlash at version 0.5 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\SerialFlash

Using library Wire at version 1.0 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire

Using library Encoder at version 1.4.1 in folder: C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Encoder

Error compiling for board Teensy 4.0.

editing settings slot is 'awkward' if a decoder is active

It feels like if a decoder (CW) is active and decoder whilst you are in the 'edit slot name' text editing menu, things get a bit weird on the screen, as the cursor jumps around to the top line, when it should be on the edit text.

I suspect one of two things:

  1. we are still calling setCursor, even though the decode 'display' is off, as we are in the menu
  2. something is a little screwy with my RGB LCD integration into the neu-rah menu library.

I suspect (1), but the code
looks good on a cursory glance:

  if (display ) {
    lcd.setCursor(0, 0);
    lcd.print(buf);
  }

Settings: save slot does not save name

There seem to be at least a couple of things wrong with the 'save settings'.

I was trying to 'clone' an existing slot and change the active NR. I selected CW (slot 5), set the slot number in the settings menu and set the name, and changed the NR algo from none to LLMS. Then I saved into slot7. When then re-selecting slot7, the name was blank and the NR was not set...

Looking at the code, it seems that saveSettings() does not save the name, which looks to be a bug. Should be an easy fix?

I've not worked out why the NR did not get set - that might require some actual debug...

Document the display values

We cover the display layout in the README, but we don't explain what the values of each entry mean. It would help users if we documented this better. Here is a very quick rundown for starters:

top line

When not in CW mode, the top line displays the current active settings slot (00-10), and the name of the slot (SSB etc, or Empty if the slot contains no settings.
When in CW mode, the decoded CW scrolls across the top line, from right to left.

Status line

The status line is always displayed, and the each status item/position has a fixed function. They are, in order from left to right:

Input volume

Shows 'bars' indicating the input signal volume level. A single '.' is the lowest level. Four 'bars' is a high level. If input clipping (volume too high) is detected then an ! will appear for 0.5s.

Bandpass filter

Indicates which bandpass filter is active. Values are:

  • -> passthru (not actually off, but 'broadbanded')
  • S SSB
  • C CW
  • A AM
  • F FM

Noise blanker

Shows if the noise blanker is on or off. Shows - for off, and an 'impulse' type character (similar to ~ or a slanted N) when active.

Auto notch

Shows if the noise blaner is enabled or not. Shows - when it is off, and a stylised V when it is on.

AGC mode

Shows which, if any, AGC (like) method is in use. Values are:

  • - Off (no AGC)
  • T software 'tracking' mode (tries to match the peak output volume with the peak input volume)
  • 5 SGTL5000 hardware AGC mode (the AGC in the audio codec hardware chip). Is not an AGC as you might think of it - there is not minimum level squelch type clip. Fundamentally it will try to maintain an even maximum volume without clipping.

Noise reduction

Shows which noise reduction algorithm is active. Values are:

  • BYP complete bypass mode (may not be possible to configure currently)
  • Off noise reduction is turned off
  • LMS LMS reduction mode
  • Kim Kim reduction mode
  • fnr fnr reduction mode
  • fnA fnrA reduction mode
  • Spc Spectral reduction mode
  • LLM LLMS reduction mode

CPU utilisation

Shows a rough estimate of the amount of CPU time that is being consumed doing the processing. Generally a fairly low number.

CW tuning aid

A rough guide to help tune in the CW decoder. The CW decoder 'listens' to the centre frequency defined for the active bandpass filter. The tuning aid listens for the 'loudest' tone in the signal, and shows one of five symbols to reflect how the detected tone relates to the bandpass:

  • << Tone much too low
  • < Tone too low
  • x Tone matched
  • > Tone too high
  • >> Tone much too high

CW WPM

Shows the current detected CW word per minute speed as detected by the decoder that is active. Note, if using the Bayesian decoder there can be some delay between signals being heard and the WPM and decoded characters being printed.

FIR filter co-efficients are 'non-optimal' - may need 'normalisation'

Whilst working on some other experimentation, I noticed that the auto-generated FIR filter co-efficients for the bandpass filters seem to introduce a lot of attenuation, and are probably not 'optimal' for the required operation. That is no real surprise, as they are generated by a quick dynamic piece of code, and calculating optimal FIR coefficients is compute intensive.

The FIR filters happen early in the chain, which means later stages are probably not getting as 'full' a bitwidth signal as they should. This probably affects their performance.

I have some experimental code already that tries to measure the gain of the coefficients at their 'centre peak' intended frequency. Let's see if that improves anything.

(If you want to look at this etc., probably best ask me first so we don't duplicate)

Problem with Grove Display

Graham,

I built up an Audio board with a Teensy 4.0 and hooked it up according to your schematic. I loaded the libraries and then compiled and uploaded the program. I am getting audio through the board and the encoder seems to be working (I can turn off the audio with a particular sequence of encoder manipulations), but I am not seeing any text on the display. The backlight is on. I am using the exact Grove RGB LCD specified in the documentation. I have the VCC for the display connected to the 3.3V output of the Teensy, GND connected to ground, and SDA and SCL connected according to the schematic. I have checked my wiring multiple times. The display I have says that it supports an input voltage of 3.3V or 5V. I thought maybe there was a problem with my compiled version of the firmware so I downloaded your .hex file and loaded it. I got the same results.

I could have a bad display, but I want to ask if you have any thoughts on what the problem might be.

Thanks,
Scott

20 memory slots and squelch/gate

Hello Graham, is it possible to increase the slots to 20 ?

How about a squelch/gate to make noise floor complete silent and only voice open the audio ?

Just ideas to make it better.

Tanks for your amazing project.

Audio IN to USB "in" ?

I am trying to get the audio incoming into the DSP to be routed in the "in/mic" of the USB, but I think I am missing something.

I have tried adding:

AudioOutputUSB           usb2;
...
AudioConnection          patchCord15(usb1, 0, usb2, 0);
AudioConnection          patchCord16(usb1, 0, usb2, 1);

Also with Q_in_L or peak_amp instead of usb1 but nothing.

What can I be missing here ?

Document the menu system

We could do with some documentation on the menu system, including:

  • how to navigate it
  • what the entries all mean
  • show the general structure/overview as a 'guide' to what is in the menu (without having to scroll through them all for instance).

Add NR2 (emnr) NR algo from WDSP library

It looks like I 'missed' an NR algo in my original research. I added the xanr algo from WDSP, but completely missed that it also contains a spectral NR algo, generally called NR2 (as that is how it is labelled in the relevant GUIs), but can be found in the file emnr.c in the library itself.

It could be quite a challenge to integrate, as:

  • it seems to have many variables and options, although there are recommended defaults
  • it uses a 'calculus' datafile, which nicely in the g0orx wdsp port it has been converted to a C array datafile, but it is ~1Mb large, so we need to see/check if we can build that for the teensy (I expect so), and if it will fit in the flash! The Teensy 4.1 has 8Mb of flash, so I think we should be OK!

Changing versions prevents slot edits being loaded

I noticed that slot saving was not taking effect after a reboot.
It turns out that if you have changed firmware versions, as we have a version dependant fingerprint in the eeprom settings, the firmware will 'default' due to an eeprom version mismatch, and load the default settings on boot - thus, skipping loading any setting changes that are stored in the eeprom.
So, the settings you edit do afaict get saved in the eeprom, they just won't get reloaded if there is an eeprom version mismatch.
The quick workaround/fix is to do a settings factory reset, which should rewrite the defaults of the current firmware into the eeprom (including the fingerprint), and then you should be able to save/load again.

If we were to make this 'really nice', we'd probably notice the eeprom version did not match the firmware, and in the settings menu 'persuade' the user they need to do a factory reset of the settings. We probably should not auot-reset the eeprom - take the 'path of least surprise' for the user.

Need to use LiquidCrystal_I2C

Hi Graham, i am not good with modifying the codes, need the thing modified to display in 1602 I2C, i cannot do it. Please help.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.