FreeDV v1.9.7.2 released

This release actually fixes what v1.9.7.1 was supposed to. Sorry for the inconvenience. Assuming no other serious crash-type bugs, we should hopefully be back to the usual release cadence (~1x/month or so).

More information and download links here.

FreeDV v1.9.7.1 released

Due to an intermittent crash discovered immediately after v1.9.7’s release, v1.9.7.1 has been released. The crash is related to the filter functionality; when the TX or RX filters are modified, an assertion failure occasionally gets thrown because the old filters aren’t fully deleted by the time the new filters need to be created.

More information and download links for this hotfix release can be found here.

FreeDV v1.9.7 released

This release contains the following content:

  1. Bugfixes:
    • Use double precision instead of float for loading frequency list. (PR #627)
    • Improve validation of frequencies in Options dialog. (PR #628)
    • Fix typo resulting in TX device sample rate being used for filter initialization. (PR #630)
    • Fix intermittent crash resulting from object thread starting before object is fully initialized. (PR #630)
    • Prevent creation of filters if not enabled. (PR #631)
    • Fix issue preventing Start button from re-enabling itself on audio device errors. (PR #636)
    • Fix issue preventing proper FreeDV Reporter column sizing on Windows. (PR #638)
    • Fix flicker in FreeDV Reporter window when tracking by frequency. (PR #637)
    • Update Filter dialog to better handle resizing. (PR #641)
    • Fix capitalization of distance units in FreeDV Reporter window. (PR #642)
    • Rename KHz to kHz in documentation and UI. (PR #643)
    • Avoid calculating distances in FreeDV Reporter window for those with invalid grid squares. (PR #646#649)
    • Fix display bugs in FreeDV Reporter window when switching between dark and light mode. (PR #646)
    • Add guard code to prevent FreeDV Reporter window from being off screen on startup. (PR #650)
    • Fix issue preventing FreeDV startup on macOS <= 10.13. (PR #652)
    • On startup, only jiggle height and not width. (PR #653)
    • Fix issue preventing FreeDV from being linked with older versions of Xcode. (PR #654)
    • Fix issue preventing TX audio from resuming after going from TX->RX in full duplex mode. (PR #655)
  2. Enhancements:
    • Allow user to refresh status message even if it hasn’t been changed. (PR #632)
    • Increase priority of status message highlight. (PR #632)
    • Adjust FreeDV Reporter data display to better match accepted UX standards. (PR #644)
    • Further reduce required space for each column in FreeDV Reporter window. (PR #646)
    • Provide an option Do save only certain FreeDV Reporter messages sent to the server. (PR #647)
  3. Build system:
    • Include PDB debugging file for FreeDV. (PR #633)
    • End support for 32 bit ARM on Windows. (PR #651)
    • Begin performing CI builds for macOS. (PR #654)
  4. Documentation:
    • Fix spelling, etc. mistakes in the documentation. (PR #640)
    • Update README to reflect latest state of codebase. (PR #654)
    • Move older changelog from user manual to separate file. (PR #654)
  5. Code cleanup:
    • Move GUI related files into their own folder. (PR #654)
    • Move build scripts into cmake folder. (PR #654)
    • Remove no longer used scripts and patch files. (PR #654)

More information and download links can be found here.

Mooneer’s FreeDV Update – December 2023

This month, freedv-gui/FreeDV Reporter got the following bug fixes and feature enhancements:

  • A minor tweak to the main window to have all section boxes be the same width.
  • 800XA mode was added to set of modes used for the multiple receive feature.
  • Serial PTT can now be enabled along with OmniRig.
  • A delay can now be added prior to transmitting audio and before bringing the radio out of transmit mode (to avoid damage to accessories such as noise cancellation devices).
  • A new feature to FreeDV Reporter to allow up to 15 character long custom messages to be reported to other users. (These messages go out solely over the internet, not over radio.)
  • Frequency units can now be displayed and entered in kHz if the user enables the appropriate setting.
  • A bug was fixed where the space bar was inappropriately putting the FreeDV application into transmit mode.
  • Compiler errors with certain versions of MinGW (used to build Windows versions of FreeDV) have been fixed.
  • A Windows-only issue was fixed that prevented the entry of very high frequencies (such as anything above 10 GHz).
  • Extra column space was removed in the FreeDV Reporter window to better enable use on smaller displays.
  • A new 60 meter frequency (5368.5 kHz) was added to the default calling frequency list to avoid interference on the previously used 60 meter frequency.
  • Validation of input was enhanced when customizing the frequency list.
  • A bug was fixed that caused the incorrect sample rates to be used for filters (when enabled).

ezDV also got the following new features:

  • Morse code beeping of the last octet of the IP address on connection to the configured router (to make it easier to find on the network).
  • Allow connection to be forced to FreeDV Reporter even if using a radio without CAT control support (e.g. non-Flex or Icom radios).
  • Minor tweaks to the web UI to improve ease of configurability for supported Wi-Fi enabled radios.

More information can be found in the commit history below:

(Note that all commit logs above were generated with the following command line:)

git log --author="member@email" --after "Month 1, 2023" --before "Month 31, 2023" --all > commit.log

David’s FreeDV update Dec 2023

Codec 2 Algorithm Description

This month I finished the Codec 2 algorithm description document. It was quite a lot of work, and ended up being 30 pages long. Thanks jimt for proof reading and Mooneer for helping with the automation (we rebuild the doc as part of our automated tests).

There was some discussion on this Codec 2 mailing list thread around the need for a formal specification versus the documentation/reference code/test approach I have taken in explaining Codec 2. I haven’t had any comments or questions on the technical content yet, I guess the audience interested in the DSP is small.

Codec 2 Machine Learning and Male Speech

For a few months I’ve been exploring the use of Machine Learning (ML) with Codec 2. This has been something of a side project, as I don’t feel competent in ML. While the field shows a lot of promise, in the past I have struggled to build any ML systems that actually do something useful. However my side project appears to work and I have some meaningful improvements in speech quality of the core Codec 2 vocoder. As I’m on a learning curve, I’ve only billed a fraction of the hours spent on this work to the ARDC grant. Thanks Jean-Marc for your tips on ML and inspiring work.

The project involved building a filter that “narrows” the bandwidth of vocal tract resonances (or formants) for low pitched male speakers. It’s these peaks (known as formants) that convey the information in speech. It addresses the problem with energy distribution that I mentioned in the October report.

The following plot shows the ML “inference” in action. The aqua plot is the smoothed spectrum (ML input), and red is the ML output, which is pretty close to the ideal (green).

The smoothed spectrum (aqua) is an intermediate processing step that reduces the information (and hence bit rate) we need to transmit. Unfortunately it messes up low pitched, male speakers, while high pitched speakers such as females pass through OK. This is puzzling, as it seems reasonable to assume that male and female speech has the same amount of information. I have a theory that the formant bandwidth is important for male speech. So I designed a ML system to recover the narrow formant bandwidths for males from the smoothed spectrum. It’s a bit like un-blurring an image. This is tricky using traditional DSP that can only do linear transformations, but finding complex, non-linear relationships is something that ML is meant to be good at.

Here are some speech samples, with Codec 2 3200 as a reference (used for M17, and roughly the same quality as AMBE/MELP). Especially through headphones, the ML input sounds buzzy and muffled. Please note the ML output sample is not quantised (that’s the next step), but previous work suggests this could be quantised to about 1600 bits/s at the same quality using traditional DSP, and perhaps lower with ML based quantisation.

ML Input, smoothed spectrum, wide bandwidth formants
ML Output, narrow formant bandwidths restored
Codec 2 3200 bit/s mode (reference anchor)

This addresses a long standing mystery (to me at least) of why low pitched male speakers sound poorer than females when the spectrum is coarsely represented. I had previously addressed this issue with a poorly understood “post filter” that used parameters based on educated guesses.

Next step is to see if we can use ML to help quantise the Codec 2 model parameters. If I can gain skills in this area we may be able to improve speech quality at a given bit rate and perhaps robustness to channel errors.