1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 17:28:50 -05:00

Compare commits

...

52 Commits

Author SHA1 Message Date
dforsi
5c7313639a
Merge efd98785cf into 66ac6174b7 2024-08-13 23:45:34 +02:00
f4exb
66ac6174b7 Updated version 2024-08-13 22:35:18 +02:00
f4exb
aec3c5ca47 Updated plugin versions 2024-08-13 22:35:18 +02:00
f4exb
0cc853f177 Updated changelogs 2024-08-13 22:35:18 +02:00
Edouard Griffiths
96478f1021
Merge pull request #2222 from f4exb/feature-wdsp
Feature wdsp
2024-08-13 15:36:54 +02:00
f4exb
3253e0088c WDSP Rx plugin: added documentation 2024-08-13 13:10:25 +02:00
f4exb
11f91b577b Added new color maps. Part of #2191 2024-08-12 10:33:53 +02:00
f4exb
eaa5445702 WDSP: more Sonar fixes 2024-08-10 23:46:47 +02:00
f4exb
ef0255f2bb WDSP: impulse responses refactoring (5) 2024-08-10 12:21:04 +02:00
f4exb
12f4d0a0fd WDSP: FIROPT rework 2024-08-10 09:59:42 +02:00
f4exb
e48dc22793 WDSP: impulse responses refactoring (4) 2024-08-10 06:40:35 +02:00
f4exb
ad3e7dfe19 WDSP: fixed missing decalc in USLEW 2024-08-10 02:09:07 +02:00
f4exb
28cfad98ff WDSP: impulse responses refactoring (3) 2024-08-10 02:06:19 +02:00
f4exb
7319e4cb88 WDSP: impulse responses refactoring (2) 2024-08-09 06:33:00 +02:00
f4exb
62f05b3706 WDSP: impulse responses refactoring (1) 2024-08-08 09:09:40 +02:00
f4exb
130d40c218 WDSP: more rework 2024-08-07 21:14:09 +02:00
f4exb
fe08cd4a78 WDSP: FIRCORE rework 2024-08-06 06:26:53 +02:00
f4exb
34917a0b21 WDSP: more rework 2024-08-05 20:05:59 +02:00
f4exb
de756413e8 WDSP: RXA and TXA rework 2024-08-03 13:54:42 +02:00
f4exb
d6159067a8 WDSP: Sonar lint fixes (2) 2024-08-03 11:05:12 +02:00
f4exb
8941835466 WDSP: Sonar lint fixes (1) 2024-08-02 08:01:46 +02:00
f4exb
4ddb6dc9ff WDSP: removed unnecessary references to RXA and TXA 2024-08-01 02:12:58 +02:00
f4exb
e52f1c0cea Do not run CI/CD for commits on feature branches 2024-08-01 02:12:28 +02:00
f4exb
cd38f356d0 WDSP: rework SSQL and PANEL classes 2024-08-01 02:01:09 +02:00
f4exb
71fe079ee3 WDSP: rework former IIR classes 2024-08-01 00:31:28 +02:00
f4exb
b9e3b10a6b WDSP: split iir source files 2024-07-31 01:37:17 +02:00
f4exb
913d5bf7b0 WDSP: CBL rework 2024-07-30 23:29:37 +02:00
f4exb
350117b9a9 WDSP: SIPHON rework 2024-07-30 22:52:21 +02:00
f4exb
575fa755f8 WDSP: BANDPASS rework 2024-07-30 00:45:32 +02:00
f4exb
bc06095a56 WDSP: WCPAGC rework 2024-07-29 23:31:43 +02:00
f4exb
7cb15bbd95 WDSP: EMNR rework 2024-07-29 20:12:44 +02:00
f4exb
6662357bcf WDSP: ANF, ANR, EMNR: use vectors instead of C arrays and disable copy constructor 2024-07-29 08:57:02 +02:00
f4exb
3c2192603b WDSP: use vectors instead of C arrays and disable copy constructor (more) and other changes 2024-07-28 11:36:45 +02:00
f4exb
86f27fc4d6 WDSP: NBP: use vectors instead of C arrays and disable copy constructor 2024-07-27 23:29:15 +02:00
f4exb
8a267240df WDSP: ANB, NOB, ANSQ: use vectors instead of C arrays and disable copy constructor 2024-07-27 13:45:09 +02:00
f4exb
59f97f3912 WDSP: restore ANB::flush and re-enable Windows and Mac builds 2024-07-27 06:01:39 +02:00
f4exb
d3cbfe0e3c WDSP: SNBA and EQ: replaced static methods and more... 2024-07-27 05:32:45 +02:00
f4exb
8c08f40b54 WDSP: FMD and FMSQ: replaced static methods 2024-07-26 19:10:53 +02:00
f4exb
a239fe47e9 WDSP: AMSQ and AMD: replaced static methods 2024-07-26 17:52:34 +02:00
f4exb
dac4bc08df WDSP: sender: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
0bd4bbe0d4 WDSP: BPSNBA: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
cc8c6d8004 WDSP: notched bandpass filter: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
42fa9f5eb2 WDSP: meter: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
8842b56080 WDSP: generator: replaced static methods (RXA) 2024-07-26 10:53:58 +02:00
f4exb
49dc91cb6b WDSP: minor adjustments 2024-07-26 10:53:58 +02:00
f4exb
e81c9cc5b0 WDSP: shift and resampler: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
71a5d7a1b4 WDSP: some Sonar fixes 2024-07-26 10:53:58 +02:00
f4exb
808fe2c075 WDSP: removed for Winmdows and Mac 2024-07-26 10:53:58 +02:00
f4exb
3bdfeb54ff WDSP: added missing exports for Mac and Windows 2024-07-26 10:53:58 +02:00
f4exb
b975658758 WDSP: Nose blanker: replaced static methods 2024-07-26 10:53:58 +02:00
f4exb
994898d9fc WDSP: simplify RXA structs 2024-07-26 10:53:58 +02:00
Daniele Forsi
efd98785cf Fix heap-use-after-free
Fixes issue #2059
AddressSanitizer: heap-use-after-free /home/sdrangel/sdrbase/audio/audiofifo.cpp:80 in AudioFifo::write(unsigned char const*, unsigned int)
AddressSanitizer: heap-use-after-free /home/sdrangel/sdrbase/audio/audiofifo.h:49 in AudioFifo::fill() const
2024-06-01 12:05:49 +02:00
216 changed files with 14849 additions and 13245 deletions

View File

@ -6,7 +6,6 @@ on:
push: push:
branches: branches:
- master - master
- feature-*
- mac_ci - mac_ci
tags: tags:
- 'v*' - 'v*'

1
.gitignore vendored
View File

@ -28,6 +28,7 @@ obj-x86_64-linux-gnu/*
**/venv*/ **/venv*/
*.pyc *.pyc
.DS_Store .DS_Store
.sonarlint
### Go ### ### Go ###
# Binaries for programs and plugins # Binaries for programs and plugins

View File

@ -1,3 +1,20 @@
sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156
* Added cubehelix based color maps. Issue #2191
* Fix API host address in About dialog and debug message. PR #2218
* Some cleanup. PR #2212
* Added shift to channel marker to take RIT into account. Part of #2156
* Added S-meter units to scale engine. Part of #2156
* Some typos fixes. PR #2206
* Map enhancements and fixes. PR #2187
* APT Demod: Check filename suffix is specified. PR #2190
* Don't change filenames on Android, PR #2190
* Frequency Scanner: Fix rounding error. PR #2186
* Update sdrangel-windows-libraries link to include latest VC redistributable. PR #2185
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 13 Aug 2024 17:01:01 +0200
sdrangel (7.21.4-1) unstable; urgency=medium sdrangel (7.21.4-1) unstable; urgency=medium
* Code fixes. PR #2184 * Code fixes. PR #2184

View File

@ -19,8 +19,8 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# configure version # configure version
set(sdrangel_VERSION_MAJOR "7") set(sdrangel_VERSION_MAJOR "7")
set(sdrangel_VERSION_MINOR "21") set(sdrangel_VERSION_MINOR "22")
set(sdrangel_VERSION_PATCH "4") set(sdrangel_VERSION_PATCH "0")
set(sdrangel_VERSION_SUFFIX "") set(sdrangel_VERSION_SUFFIX "")
# SDRAngel cmake options # SDRAngel cmake options

17
debian/changelog vendored
View File

@ -1,3 +1,20 @@
sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156
* Added cubehelix based color maps. Issue #2191
* Fix API host address in About dialog and debug message. PR #2218
* Some cleanup. PR #2212
* Added shift to channel marker to take RIT into account. Part of #2156
* Added S-meter units to scale engine. Part of #2156
* Some typos fixes. PR #2206
* Map enhancements and fixes. PR #2187
* APT Demod: Check filename suffix is specified. PR #2190
* Don't change filenames on Android, PR #2190
* Frequency Scanner: Fix rounding error. PR #2186
* Update sdrangel-windows-libraries link to include latest VC redistributable. PR #2185
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 13 Aug 2024 17:01:01 +0200
sdrangel (7.21.4-1) unstable; urgency=medium sdrangel (7.21.4-1) unstable; urgency=medium
* Code fixes. PR #2184 * Code fixes. PR #2184

BIN
doc/img/WDSPRx_AGC.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

BIN
doc/img/WDSPRx_CWpeak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
doc/img/WDSPRx_EQ.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

BIN
doc/img/WDSPRx_NB.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

BIN
doc/img/WDSPRx_NB2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

BIN
doc/img/WDSPRx_NR.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
doc/img/WDSPRx_NR2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

BIN
doc/img/WDSPRx_RXA.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

BIN
doc/img/WDSPRx_plugin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
doc/img/WDSPRx_plugin.xcf Normal file

Binary file not shown.

BIN
doc/img/WDSPRx_plugin_A.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
doc/img/WDSPRx_plugin_A.xcf Normal file

Binary file not shown.

BIN
doc/img/WDSPRx_struct.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -1,2 +1,9 @@
#!/bin/sh #!/bin/sh
git diff --name-only ${1}..${2} | grep plugins/ | cut -d'/' -f2,3 | sort -u BASEDIR=$(dirname $0)
PLUGINS=$(git diff --name-only ${1}..${2} | grep plugins/ | cut -d'/' -f2,3 | sort -u)
for plugin in $PLUGINS
do
FILE=$(find $BASEDIR/plugins/$plugin -name "*plugin.cpp")
sed -i -E "s/QStringLiteral\(\"7\.(.*)\"\)/QStringLiteral\(\"7\.22\.0\"\)/" $FILE
done

View File

@ -34,7 +34,7 @@
const PluginDescriptor DOA2Plugin::m_pluginDescriptor = { const PluginDescriptor DOA2Plugin::m_pluginDescriptor = {
DOA2::m_channelId, DOA2::m_channelId,
QStringLiteral("DOA 2 sources"), QStringLiteral("DOA 2 sources"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,7 +30,7 @@
const PluginDescriptor ADSBPlugin::m_pluginDescriptor = { const PluginDescriptor ADSBPlugin::m_pluginDescriptor = {
ADSBDemod::m_channelId, ADSBDemod::m_channelId,
QStringLiteral("ADS-B Demodulator"), QStringLiteral("ADS-B Demodulator"),
QStringLiteral("7.21.2"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor AISDemodPlugin::m_pluginDescriptor = { const PluginDescriptor AISDemodPlugin::m_pluginDescriptor = {
AISDemod::m_channelId, AISDemod::m_channelId,
QStringLiteral("AIS Demodulator"), QStringLiteral("AIS Demodulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,7 +29,7 @@
const PluginDescriptor APTDemodPlugin::m_pluginDescriptor = { const PluginDescriptor APTDemodPlugin::m_pluginDescriptor = {
APTDemod::m_channelId, APTDemod::m_channelId,
QStringLiteral("APT Demodulator"), QStringLiteral("APT Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE and Aptdec authors"), QStringLiteral("(c) Jon Beniston, M7RCE and Aptdec authors"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,7 +30,7 @@ const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor =
{ {
ATVDemod::m_channelId, ATVDemod::m_channelId,
QStringLiteral("ATV Demodulator"), QStringLiteral("ATV Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) F4HKW for F4EXB / SDRAngel"), QStringLiteral("(c) F4HKW for F4EXB / SDRAngel"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor BFMPlugin::m_pluginDescriptor = { const PluginDescriptor BFMPlugin::m_pluginDescriptor = {
BFMDemod::m_channelId, BFMDemod::m_channelId,
QStringLiteral("Broadcast FM Demodulator"), QStringLiteral("Broadcast FM Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,7 +29,7 @@
const PluginDescriptor ChirpChatPlugin::m_pluginDescriptor = { const PluginDescriptor ChirpChatPlugin::m_pluginDescriptor = {
ChirpChatDemod::m_channelId, ChirpChatDemod::m_channelId,
QStringLiteral("ChirpChat Demodulator"), QStringLiteral("ChirpChat Demodulator"),
QStringLiteral("7.21.2"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor DABDemodPlugin::m_pluginDescriptor = { const PluginDescriptor DABDemodPlugin::m_pluginDescriptor = {
DABDemod::m_channelId, DABDemod::m_channelId,
QStringLiteral("DAB Demodulator"), QStringLiteral("DAB Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE. DAB library by Jvan Katwijk"), QStringLiteral("(c) Jon Beniston, M7RCE. DAB library by Jvan Katwijk"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,7 +31,7 @@ const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor =
{ {
DATVDemod::m_channelId, DATVDemod::m_channelId,
QStringLiteral("DATV Demodulator"), QStringLiteral("DATV Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"), QStringLiteral("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -45,9 +45,7 @@ class LDPCEncoder
return b < TYPE(0) ? -a : b > TYPE(0) ? a : TYPE(0); return b < TYPE(0) ? -a : b > TYPE(0) ? a : TYPE(0);
} }
public: public:
LDPCEncoder() LDPCEncoder() = default
{
}
void init(LDPCInterface *it) void init(LDPCInterface *it)
{ {

View File

@ -33,7 +33,7 @@
const PluginDescriptor DSCDemodPlugin::m_pluginDescriptor = { const PluginDescriptor DSCDemodPlugin::m_pluginDescriptor = {
DSCDemod::m_channelId, DSCDemod::m_channelId,
QStringLiteral("DSC Demodulator"), QStringLiteral("DSC Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor EndOfTrainDemodPlugin::m_pluginDescriptor = { const PluginDescriptor EndOfTrainDemodPlugin::m_pluginDescriptor = {
EndOfTrainDemod::m_channelId, EndOfTrainDemod::m_channelId,
QStringLiteral("End-of-Train Demodulator"), QStringLiteral("End-of-Train Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor NavtexDemodPlugin::m_pluginDescriptor = { const PluginDescriptor NavtexDemodPlugin::m_pluginDescriptor = {
NavtexDemod::m_channelId, NavtexDemod::m_channelId,
QStringLiteral("Navtex Demodulator"), QStringLiteral("Navtex Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor PagerDemodPlugin::m_pluginDescriptor = { const PluginDescriptor PagerDemodPlugin::m_pluginDescriptor = {
PagerDemod::m_channelId, PagerDemod::m_channelId,
QStringLiteral("Pager Demodulator"), QStringLiteral("Pager Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor RadiosondeDemodPlugin::m_pluginDescriptor = { const PluginDescriptor RadiosondeDemodPlugin::m_pluginDescriptor = {
RadiosondeDemod::m_channelId, RadiosondeDemod::m_channelId,
QStringLiteral("Radiosonde Demodulator"), QStringLiteral("Radiosonde Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor RttyDemodPlugin::m_pluginDescriptor = { const PluginDescriptor RttyDemodPlugin::m_pluginDescriptor = {
RttyDemod::m_channelId, RttyDemod::m_channelId,
QStringLiteral("RTTY Demodulator"), QStringLiteral("RTTY Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor SSBPlugin::m_pluginDescriptor = { const PluginDescriptor SSBPlugin::m_pluginDescriptor = {
SSBDemod::m_channelId, SSBDemod::m_channelId,
QStringLiteral("SSB Demodulator"), QStringLiteral("SSB Demodulator"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor VORDemodPlugin::m_pluginDescriptor = { const PluginDescriptor VORDemodPlugin::m_pluginDescriptor = {
VORDemod::m_channelId, VORDemod::m_channelId,
QStringLiteral("VOR Demodulator"), QStringLiteral("VOR Demodulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor FreqScannerPlugin::m_pluginDescriptor = { const PluginDescriptor FreqScannerPlugin::m_pluginDescriptor = {
FreqScanner::m_channelId, FreqScanner::m_channelId,
QStringLiteral("Frequency Scanner"), QStringLiteral("Frequency Scanner"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor HeatMapPlugin::m_pluginDescriptor = { const PluginDescriptor HeatMapPlugin::m_pluginDescriptor = {
HeatMap::m_channelId, HeatMap::m_channelId,
QStringLiteral("Heat Map"), QStringLiteral("Heat Map"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,7 +29,7 @@
const PluginDescriptor RadioAstronomyPlugin::m_pluginDescriptor = { const PluginDescriptor RadioAstronomyPlugin::m_pluginDescriptor = {
RadioAstronomy::m_channelId, RadioAstronomy::m_channelId,
QStringLiteral("Radio Astronomy"), QStringLiteral("Radio Astronomy"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor RadioClockPlugin::m_pluginDescriptor = { const PluginDescriptor RadioClockPlugin::m_pluginDescriptor = {
RadioClock::m_channelId, RadioClock::m_channelId,
QStringLiteral("Radio Clock"), QStringLiteral("Radio Clock"),
QStringLiteral("7.21.3-"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -35,7 +35,7 @@
const PluginDescriptor RemoteTCPSinkPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteTCPSinkPlugin::m_pluginDescriptor = {
RemoteTCPSink::m_channelId, RemoteTCPSink::m_channelId,
QStringLiteral("Remote TCP channel sink"), QStringLiteral("Remote TCP channel sink"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -0,0 +1,442 @@
<h1>WDSP receiver plugin</h1>
<h2>Introduction</h2>
This plugin implements a modified "RXA unit" of the [WDSP library](https://github.com/TAPR/OpenHPSDR-wdsp) by Warren Pratt, NR0V. This library has been extensively modified to be productively included in SDRangel and can be found in the "wdsp" subdirectory of this repository. However the original DSP algorithms have been preserved and I want to address my thanks to the original author for making it available to the community. Only the code structure was modified to meet Qt and C++ standards. The original version written in C could not benefit of modern C++ features. Also the multithreading support was entirely removed as this is already handled at the upper level in SDRangel. This greatly simplifies the code. Although the details of implementation have been changed the explanation of DSP algorithms found in the [documentation](https://github.com/TAPR/OpenHPSDR-wdsp/blob/master/wdsp%201.24/WDSP%20Guide%2C%20Rev%201.24.pdf) is still valid.
The WDSP library is at the heart of OpenHPSDR and Pi-HPSDR projects and both implement excellent communication receivers. Experience with Pi-HPSDR was the main motivation to create this plugin.
As explained in the documentation the WDSP engine is organized in channels comprising a single unit itself composed of several blocks. In the implementation here only units and blocks were retained and more specifically this plugin makes use of the "RXA" unit. The channel is somehow represented by the channel plugin itself.
![WDSP structure](../../../doc/img/WDSPRx_struct.png)
This "RXA" unit is originally composed of these blocks:
![WDSP RXA](../../../doc/img/WDSPRx_RXA.png)
- Frequency Shifter: used to implement the RIT functionality
- Input Resampler: is not used. The channel interpolator/decimator is used to give a fixed rate of 48 kS/s which is the internal DSP rate of the RXA unit
- Signal Generator: was removed in this implementation
- Input Meter: not used
- Notched Bandpass: this is the main input filter and is permanently active but the notch feature is not used
- S Meter: permanently active this is used for channel power displays
- Post filter display send: permanently active this is the tap providing the spectrum view (B)
- AM Squelch capture: used in AM squelch functionality
- AM/SAM Demodulator: used for AM/SAM modes
- FM Demodulator: used for FM mode
- FM Squelch apply: used in FM squelch functionality
- Spectral Noise blanker: not used
- Equalizer: used in equalizer functionality
- AGC: used in AGC functionality
- Auto Notch Filter: used in ANF functionality
- LMS Noise Reduction: used in noise reduction ¨NR" mode
- Spectral Noise Reduction: used in noise reduction ¨NR2" mode
- Bandpass Filter: participates in the global channel filtering
- AGC Meter: not used
- Scope/Phase display send: not used
- AM Carrier Block: not used
- CW peaking filter: used in CW functionality
- Dolly Filter: not used
- Syllabic Squelch: not displayed in the diagram above. Implements the voice squelch mode mostly useful and efficient in SSB.
- Patch Panel: used for volume and pan controls
- AM Squelch Apply: participates in AM squeclh functionality
- Output resampler: used if the audio sample rate is not 48 kS/s
In addition the noise blanker apply to the complete I/Q stream before it enters the RXA chain described above thus on the full 48 kHz stream. There are two available:
- Preemptive Wideband Noise Blanker described at p.122 of the documentation implements the "NB" noise blanker mode
- Interpolating Wideband Noise Blanker described at p.129 of the documentation implements the "NB2" noise blanker mode
Using this RXA unit this plugin provides something similar to the VFO concept found in other SDR software and hardware radios. It implements the classical amateur radio and SWL audio modes: SSB, AM, FM. CW is not considered a mode apart here. To work CW signals one selects the SSB mode (then USB or LSB) and one may use the CW peaking filter to isolate even more the pitch of interest. The trick to move the displayed frequency on the expected pitch is explained in the RIT section (A.13).
While the advantage over AM and NFM demodulator plugins is debatable this plugin is much more advanced than the SSB demodulator plugin for working SSB and CW signals and generally should be preferred over the SSB demodulator plugin. It retains the SSB demodulator plugin GUI presentation but with better and extended capabilities.
<h2>Interface</h2>
The top and bottom bars of the channel window are described [here](../../../sdrgui/channel/readme.md)
Similarly to the SSB demodulator plugin the center of the GUI is divided into the settings (A) and spectrum (B) areas (sections).
![WDSP Rx plugin](../../../doc/img/WDSPRx_plugin.png)
<h2>B: Spectrum</h2>
The spectrum view and controls is similar to other spectrum views. Controls on the bottom of the panel are identical to the ones of the main spectrum display. Details on the spectrum view and controls can be found [here](../../../sdrgui/gui/spectrum.md).
This is the spectrum seen after the bandpass filter. The span can be controlled via the span setting (A.11). In LSB mode the frequencies displayed are negative to take into account the spectrum reversal.
<h2>A: Settings</h2>
![WDSP Rx plugin settings](../../../doc/img/WDSPRx_plugin_A.png)
<h3>A.1: Frequency shift from center frequency of reception</h3>
Use the wheels to adjust the frequency shift in Hz from the center frequency of reception. Left click on a digit sets the cursor position at this digit. Right click on a digit sets all digits on the right to zero. This effectively floors value at the digit position. Wheels are moved with the mouse wheel while pointing at the wheel or by selecting the wheel with the left mouse click and using the keyboard arrows. Pressing shift simultaneously moves digit by 5 and pressing control moves it by 2.
<h3>A.2: Channel power</h3>
Average total power in dB relative to a +/- 1.0 amplitude signal received in the pass band.
<h3>A.3: Monaural/binaural toggle</h3>
- Monaural: the scalar signal is routed to both left and right audio channels. Note that you should set this mode for the CW decoder feature to work.
- Binaural: the complex signal is fed with the real part on the left audio channel and the imaginary part to the right audio channel.
Right clicking on this button opens a dialog to control audio pan:
![WDSP Rx AM plugin settings](../../../doc/img/WDSPRx_AudioPan_dialog.png)
The "0" button resets the balance to the center. Use the slider to pan the audio more left or more right.
<h3>A.4: Invert left and right channels</h3>
Inverts left and right audio channels. Useful in binaural mode only.
<h3>A.5: Demodulation mode</h3>
Sets the demodulation mode between:
- SSB: for DSB, USB, LSB, CW
- AM: for AM in classical detection mode
- SAM: for AM in synchronous mode
- FM: for narrowband FM
Right clicking on this button opens a dialog to control settings pertaining to the current mode:
**SSB**: no dialog
**AM/SAM**:
![WDSP Rx AM dialog](../../../doc/img/WDSPRx_AM_dialog.png)
There is only one control. This "fade level" when checked substitutes the received carrier with a constant magnitude carrier overcoming possible carrier fades.
**FM**:
![WDSP Rx FM settings](../../../doc/img/WDSPRx_FM_dialog.png)
<h4>1: Expected FM deviation</h4>
Expected FM deviation in kHz. The value appears on the right of the control.
<h4>2: Audio filter low frequency cutoff</h4>
Audio filter low frequency cutoff in kHz. The value appears on the right of the control.
<h4>3: Audio filter high frequency cutoff</h4>
Audio filter high frequency cutoff in kHz. The value appears on the right of the control.
<h4>4: AF limiter</h4>
This is an AGC on the audio signal.
<h4>5: AF limiter gain</h4>
This is the top gain of the audio AGC.
<h4>6: CTCSS notch filter</h4>
This filter can be used to notch out the CTCSS tones. Of course this is useful only if the low frequency cutoff of the audio filter (2) is lower than the tone frequency.
<h4>7: CTCSS notch frequency</h4>
Select the CTCSS frequency to be notched out.
<h3>A.6: Sideband flip</h3>
Flip LSB/USB. Mirror filter bandwidth around zero frequency and change from LSB to USB or vice versa. Works in SSB mode only. This is similar to the same control of the SSB demodulator.
<h3>A.7: SSB/DSB demodulation</h3>
Toggles between SSB (icon with one sideband signal) and DSB (icon with double sidebands signal). In SSB mode the shape of the icon represents LSB or USB operation. This is similar to the same control of the SSB demodulator.
<h3>A.8: Profile selection</h3>
Selects the current profile. A profile keeps track of most of the settings. This allows to rapidly toggle between demodulation modes or between different preferences for the same modulation mode. Up to 10 profiles (0 to 9) can be stored. The current profile number is displayed at the right of the dial button.
<h3>A.9: S points / dB</h3>
Toggles between S points and dB units display for the level meter (A.10)
<h3>A.10: Level meter</h3>
- top bar (green): average value
- bottom bar (blue green): instantaneous peak value
- tip vertical bar (bright green): peak hold value
<h3>A.11: Spectrum display frequency span</h3>
The DSP sample rate of 48 kS/s is further decimated by powers of two for the spectrum display and bandpass filter limits. This effectively sets the total available bandwidth depending on the decimation:
- **1** (no decimation): 24 kHz (SSB) or 48 kHz (DSB)
- **2**: 12 kHz (SSB) or 24 kHz (DSB)
- **4**: 6 kHz (SSB) or 12 kHz (DSB)
- **8**: 3 kHz (SSB) or 6 kHz (DSB)
- **16**: 1.5 kHz (SSB) or 3 kHz (DSB)
<h3>A.12: Bandpass FIR filter window</h3>
Controls the window applied to the impulse response of the bandpass filter. According to WDSP documentation you may leave it to "B-H4" which is the 4 term Blackman-Harris window. "B-H7" is the 7 term Blackman-Harris window and is generally an overkill. You have the choice still.
<h3>A.13: Toggles RIT</h3>
Toggles the RIT feature. Internally it uses the "shift" block of the "RXA" unit and hence applies an extra shift over the main frequency shift (A.1) effectively implementing a RIT feature.
You may want to take advantage of the RIT when listening to CW signals. By setting the RIT frequency value (A.14) to the opposite of the desired pitch from the center frequency the displayed frequency and channel marker on the spectrum will fall right on the signal when the proper pitch is obtained. This can greatly facilitate tuning the CW signal at the right pitch which is important if you are using the CW peaking filter (A.23)
For example if the desired pitch is 600 Hz and you are set in USB mode then you would set the RIT frequency to -600 Hz. Conversely if you are set in LSB mode the RIT frequency would be +600 Hz.
When the RIT is engaged the bandwidth display on the spectrum channel marker moves accordingly while the center frequency stays fixed.
<h3>A.14: RIT frequency</h3>
Sets the RIT frequency shift in Hz. The value is displayed at the right of the button.
<h3>A.15: Bandpass filter near frequency cutoff</h3>
Controls the filter cutoff frequency closest to zero with a positive value in USB mode and a negative value in LSB mode. The value is limited by the far frequency cutoff so that it is always lower to the far frequency cutoff in absolute value.
This is effective only for SSB. The value is automatically set to 0 in DSB, AM or FM and control is disabled.
This is similar to the same control in the SSB demodulator.
<h3>A.16: Bandpass filter far frequency cutoff</h3>
Controls the filter cutoff frequency farthest to zero with a positive value in USB mode and a negative value in LSB mode. Moving the slider in the positive range effectively sets the USB mode while moving it in the negative range sets the LSB mode.
One may also use the sideband flip (A.6) to quickly change between USB and LSB keeping the same filter limits.
In DSB, AM and FM it just controls the filter half bandwidth.
This is similar to the same control in the SSB demodulator.
<h3>A.17: Volume control</h3>
Controls the audio volume in dB. The value is displayed at the right of the button.
<h3>A.18: AGC</h3>
Toggles AGC. You would usually leave it always on. You will find details on the AGC algorithm starting p.41 of the WDSP documentation. By right clicking on the button the AGC controls dialog is opened:
![WDSP AGC Dialog](../../../doc/img/WDSPRx_AGC_dialog.png)
<h4>1: AGC mode</h4>
- **Long**: Hang time = 2000 ms. Decay_time_constant = 2000 ms
- **Slow**: Hang time = 1000 ms. Decay_time_constant = 500 ms
- **Medium**: Hang is turned OFF. Decay_time_constant = 250 ms
- **Fast**: Hang is turned OFF. Decay_time_constant = 50 ms
<h4>2: AGC slope</h4>
Adjust the slope in dB. See the diagram next paragraph for details.
<h4>3: Hang threshold</h4>
<H3>A.19: AGC top value</h3>
This is the top value in dB of the gain applied to the signal. You may want to adjust it depending on the conditions to avoid audio signal saturation.
In the following diagram extracted from WDSP documentation the top value is the red line, It is set at 0 dB on the diagram. The actual value is controlled by this button:
![WDSP AGC](../../../doc/img/WDSPRx_AGC.png)
The diagram also shows the effect of the "slope" setting found in the AGC control dialog (A.18)
<h3>A.20: Noise Reduction</h3>
Toggles the noise reduction feature. Details in the WDSP documentation start at p.51 There are 2 possible noise reduction schemes.
Principle of LMS Noise reduction extracted from WDSP documentation:
![WDSP NR](../../../doc/img/WDSPRx_NR.png)
Principe of spectral noise reduction extracted from WDSP documentation:
![WDSP NR2](../../../doc/img/WDSPRx_NR2.png)
Right clicking on this button opens a dialog to control noise reduction settings:
![WDSP AGC](../../../doc/img/WDSPRx_NR_dialog.png)
<h4>1: Noise reduction scheme</h4>
Choice is between "NR" for LMS Noise Reduction and "NR2" for Spectral Noise Reduction.
NR usually works better for CW possibly FM while NR2 works better for SSB and AM/SAM.
<h4>2: NR2 gain per frequency bin calculation</h4>
Applies to spectral noise reduction (NR2). Choice between:
- **Linear**: Gaussian speech distribution, linear amplitude scale
- **Log**: Gaussian speech distribution, log amplitude scale
- **Gamma**: (default) Gamma speech distribution
According to WDSP documentation *"All three choices will produce
somewhat similar results with the default Gamma speech distribution being somewhat preferred."*
<h4>3: NR2 Noise Power Estimation method</h4>
Applies to spectral noise reduction (NR2). Choice between:
- **OSMS**: (default) Optimal Smoothing Minimum Statistics
- **MMSE**: Minimum MeanSquare Error
According to WDSP documentation *"Both choices will produce somewhat similar results. For general operation, the default is preferred. In situation involving sudden changes in signal/noise amplitude, e.g., with "static crashes" caused by lightning, the MMSE method may be preferred due to its ability to more rapidly adjust to the changes."*
<h4>4: Noise reduction position</h4>
Applies to both NR and NR2. Locates the noise reduction block either before or after the AGC is applied.
<h4>5: NR2 artifacts reduction</h4>
Applies to spectral noise reduction (NR2). Turns off/on an artifactelimination postfilter. It is recommended to leave it always on.
<h3>A.21: Noise Blanking</h3>
Toggles the noise blanking feature. Details in the WDSP documentation start at p.122. Choice is between Preemptive Wideband Noise Blanker (NB) and Interpolating Wideband Noise Blanker (NB2)
Principe of the Preemptive Wideband Noise Blanker extracted from WDSP documentation:
![WDSP NB](../../../doc/img/WDSPRx_NB.png)
Principle of the Interpolating Wideband Noise Blanker extracted from WDSP documentation:
![WDSP NB2](../../../doc/img/WDSPRx_NB2.png)
Right clicking on this button opens a dialog to control noise blanking settings:
![WDSP NB dialog](../../../doc/img/WDSPRx_NB_dialog.png)
<h4>1: Noise blanker scheme</h4>
Choice between "NB" or Preemptive Wideband Noise Blanker and "NB2" or Interpolating Wideband Noise Blanker.
<h4>2: NB2 mode</h4>
Determines what estimate values are used for the sequence of corrupt samples to be replaced. Choice between:
- **Zero**: zero mode: estimate as zero
- **Sample&Hold**: take the value of noncorrupt signal at the beginning of the impulse and hold that throughout the corrupt sequence
- **Mean Hold**: average the noncorrupt values at the beginning and end of the corrupt sequence and use that as the estimate during the corrupt sequence
- **Hold Sample**: take the value of noncorrupt signal at the end of the impulse and hold that throughout the corrupt sequence
- **Interpolate**: linearly interpolate across the corrupt sequence
<h4>3: Slew time</h4>
This is the duration of the raisedcosine transitions between normal signal levels and the zero estimate during an impulse (tau)
<h4>4: Lag time</h4>
This is the hang time after the impulse
<h4>5: Averaging time</h4>
This is the timeconstant for averaging power across the wide bandwidth (back tau)
<h4>6: Lead time</h4>
This is the advance time before the impulse
<h4>7: Threshold</h4>
A sample is judged to be part of an impulse if its magnitude is greater than threshold*average_power. If threshold is too low, normal signals may be wrongly identified as impulse noise. If it is too high, successful detection will not occur.
<h3>A.22: Automatic Notch Filter</h3>
Toggles the Automatic Notch Filter. This is useful to eliminate a single tone signal. Of course this is not to be used for CW since it would automatically cancel the CW signal.
<h3>A.23: CW peaking filter</h3>
Toggles the CW peaking filter. The CW Peaking Filter is an audio IIR filter intended to peak a single frequency, the frequency of a
desired CW signal.
This is the diagram extracted from WDSP documentation showing the response of the filter for different bandwidths:
![WDSP CW peaking](../../../doc/img/WDSPRx_CWpeak.png)
Right clicking on this button opens a dialog controlling the details of this filter:
![WDSP CW dialog](../../../doc/img/WDSPRx_CW_dialog.png)
<h4>1: Peak frequency</h4>
Adjust the center frequency (Hz) of the filter. This should correspond to the desired pitch. To center the CW signal on this pitch frequency see RIT (A.13) for a practical method.
<h4>2: Bandwidth</h4>
Bandwidth (at -3 dB) of the filter in Hz.
<h4>4: Gain</h4>
Gain of the filter in linear terms (not dB)
<h3>A.24: Squelch</h3>
Toggles the squelch feature. Right clicking on this button opens a dialog to control squelch details:
![WDSP SQ dialog](../../../doc/img/WDSPRx_SQ_dialog.png)
<h4>1: Squelch type</h4>
These checkboxes let you choose the type of squelch that is applied. It enables the options corresponding to the selected type of squelch (Voice: options 2 and 3, AM option 4).
- **Voice**: This type of squelch is based on identifying voice artifacts to open the squelch. It best applies to SSB.
- **AM**: This is the classical magnitude based squelch. It best applies to AM and CW
- **FM**: This squelch is based on measuring the noise level after the discriminator and opens the squelch if it falls below a certain level. It only applies to FM (of course).
<h4>2: Mute time constant</h4>
For voice squelch this is the time to progressively mute the signal when the squelch closes.
<h4>3: Un-mute time constant</h4>
For voice squelch this is the time to progressively un-mute the signal when the squelch opens.
<h4>4: Maximum tail time</h4>
For AM squelch this is the maximum grace period after the squelch closes to effectively mute the audio.
<h3>A.25: Squelch threshold</h3>
Controls the squelch threshold. The value is a percentage and its effect depends on the type of squelch used (selected by A.23 dialog). Generally the greater the value the higher the threshold. Given &theta; is the factor value from 0.0 (0%) to 1.0 (100%):
- Voice squelch: see `ssql.cpp` WDSP code: $0,75\times\theta$
- AM squelch: magnitude threshold in dB: $160\times\theta - 160$
- FM squelch: squelch opens if noise magnitude falls below this value: $0.9\times10^{-2\theta}$
<h3>A.26: Equalizer</h3>
Toggles a 10 frequency points with continuous response equalizer. This diagram extracted from the WDSP documentation explains the difference with a classical band equalizer:
![WDSP EQ](../../../doc/img/WDSPRx_EQ.png)
Right clicking on this opens a dialog to control equalizer details:
![WDSP EQ dialog](../../../doc/img/WDSPRx_EQ_dialog.png)
<h4>1: Preamplifier gain</h4>
This is in fact the global gain in dB. The value appears at the right of the slider.
<h4>2: Frequencies</h4>
Specify the frequency (Hz) of each of the 10 points. Defaults are at the center of the possible ranges:
- **f1**: from 0 to 48 Hz
- **f2**: from 49 to 94 Hz
- **f3**: from 95 to 187 Hz
- **f4**: from 188 to 375 Hz
- **f5**: from 376 to 750 Hz
- **f6**: from 751 to 1500 Hz
- **f7**: from 1501 to 3000 Hz
- **f8**: from 3001 to 6000 Hz
- **f9**: from 6001 to 12000 Hz
- **f10**: from 12001 to 20000 Hz
<h4>3: Gains</h4>
Specify the gain (dB) at each of the 10 frequency points. The value appears at the right of the slider.

View File

@ -279,6 +279,9 @@ QByteArray WDSPRxSettings::serialize() const
s.writeDouble(163 + 100*i, m_profiles[i].m_ssqlTauMute); s.writeDouble(163 + 100*i, m_profiles[i].m_ssqlTauMute);
s.writeDouble(164 + 100*i, m_profiles[i].m_ssqlTauUnmute); s.writeDouble(164 + 100*i, m_profiles[i].m_ssqlTauUnmute);
s.writeDouble(165 + 100*i, m_profiles[i].m_amsqMaxTail); s.writeDouble(165 + 100*i, m_profiles[i].m_amsqMaxTail);
// RIT
s.writeBool( 183 + 100*i, m_profiles[i].m_rit);
s.writeDouble(184 + 100*i, m_profiles[i].m_ritFrequency);
// Equalizer // Equalizer
s.writeBool( 190 + 100*i, m_profiles[i].m_equalizer); s.writeBool( 190 + 100*i, m_profiles[i].m_equalizer);
s.writeFloat(4100 + 100*i, m_profiles[i].m_eqF[0]); s.writeFloat(4100 + 100*i, m_profiles[i].m_eqF[0]);
@ -403,15 +406,15 @@ bool WDSPRxSettings::deserialize(const QByteArray& data)
d.readU32( 74, &utmp, 0); d.readU32( 74, &utmp, 0);
if ((utmp > 1023) && (utmp < 65535)) { if ((utmp > 1023) && (utmp < 65535)) {
m_reverseAPIPort = utmp; m_reverseAPIPort = (uint16_t) utmp;
} else { } else {
m_reverseAPIPort = 8888; m_reverseAPIPort = 8888;
} }
d.readU32( 75, &utmp, 0); d.readU32( 75, &utmp, 0);
m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; m_reverseAPIDeviceIndex = utmp > 99 ? 99 : (uint16_t) utmp;
d.readU32( 76, &utmp, 0); d.readU32( 76, &utmp, 0);
m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp; m_reverseAPIChannelIndex = utmp > 99 ? 99 : (uint16_t) utmp;
d.readS32( 77, &m_streamIndex, 0); d.readS32( 77, &m_streamIndex, 0);
if (m_rollupState) if (m_rollupState)
@ -464,9 +467,9 @@ bool WDSPRxSettings::deserialize(const QByteArray& data)
// Filter // Filter
d.readS32 (100 + 100*i, &m_profiles[i].m_spanLog2, 3); d.readS32 (100 + 100*i, &m_profiles[i].m_spanLog2, 3);
d.readS32 (101 + 100*i, &tmp, 30); d.readS32 (101 + 100*i, &tmp, 30);
m_profiles[i].m_highCutoff = tmp * 100.0; m_profiles[i].m_highCutoff = (float) tmp * 100.0f;
d.readS32 (102 + 100*i, &tmp, 3); d.readS32 (102 + 100*i, &tmp, 3);
m_profiles[i].m_lowCutoff = tmp * 100.0; m_profiles[i].m_lowCutoff = (float) tmp * 100.0f;
d.readS32 (103 + 100*i, &m_profiles[i].m_fftWindow, 0); d.readS32 (103 + 100*i, &m_profiles[i].m_fftWindow, 0);
// AGC // AGC
d.readBool( 110 + 100*i, &m_profiles[i].m_agc, true); d.readBool( 110 + 100*i, &m_profiles[i].m_agc, true);

View File

@ -26,7 +26,6 @@
#include "util/messagequeue.h" #include "util/messagequeue.h"
#include "maincore.h" #include "maincore.h"
#include "RXA.hpp" #include "RXA.hpp"
#include "nbp.hpp"
#include "meter.hpp" #include "meter.hpp"
#include "patchpanel.hpp" #include "patchpanel.hpp"
#include "wcpAGC.hpp" #include "wcpAGC.hpp"
@ -38,12 +37,12 @@
#include "nob.hpp" #include "nob.hpp"
#include "amd.hpp" #include "amd.hpp"
#include "fmd.hpp" #include "fmd.hpp"
#include "iir.cpp"
#include "ssql.hpp" #include "ssql.hpp"
#include "amsq.hpp" #include "amsq.hpp"
#include "fmsq.hpp" #include "fmsq.hpp"
#include "eq.hpp" #include "eqp.hpp"
#include "shift.hpp" #include "shift.hpp"
#include "speak.hpp"
#include "wdsprxsink.h" #include "wdsprxsink.h"
@ -83,10 +82,10 @@ void WDSPRxSink::SpectrumProbe::proceed(const float *in, int nb_samples)
{ {
if (!(m_undersampleCount++ & decim_mask)) if (!(m_undersampleCount++ & decim_mask))
{ {
float avgr = m_sum.real() / decim; float avgr = m_sum.real() / (float) decim;
float avgi = m_sum.imag() / decim; float avgi = m_sum.imag() / (float) decim;
if (!m_dsb & !m_usb) if (!m_dsb && !m_usb)
{ // invert spectrum for LSB { // invert spectrum for LSB
m_sampleVector.push_back(Sample(avgi*SDR_RX_SCALEF, avgr*SDR_RX_SCALEF)); m_sampleVector.push_back(Sample(avgi*SDR_RX_SCALEF, avgr*SDR_RX_SCALEF));
} }
@ -125,14 +124,14 @@ WDSPRxSink::WDSPRxSink() :
m_sPeak = 0.0; m_sPeak = 0.0;
m_sCount = m_wdspBufSize; m_sCount = m_wdspBufSize;
m_rxa = WDSP::RXA::create_rxa( m_rxa = new WDSP::RXA(
m_wdspSampleRate, // input samplerate m_wdspSampleRate, // input samplerate
m_wdspSampleRate, // output samplerate m_wdspSampleRate, // output samplerate
m_wdspSampleRate, // sample rate for mainstream dsp processing (dsp) m_wdspSampleRate, // sample rate for mainstream dsp processing (dsp)
m_wdspBufSize // number complex samples processed per buffer in mainstream dsp processing m_wdspBufSize // number complex samples processed per buffer in mainstream dsp processing
); );
m_rxa->setSpectrumProbe(&m_spectrumProbe); m_rxa->setSpectrumProbe(&m_spectrumProbe);
WDSP::RXA::SetPassband(*m_rxa, 0, m_Bandwidth); m_rxa->setPassband(0, m_Bandwidth);
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
applySettings(m_settings, true); applySettings(m_settings, true);
@ -140,7 +139,7 @@ WDSPRxSink::WDSPRxSink() :
WDSPRxSink::~WDSPRxSink() WDSPRxSink::~WDSPRxSink()
{ {
WDSP::RXA::destroy_rxa(m_rxa); delete m_rxa;
} }
void WDSPRxSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) void WDSPRxSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
@ -175,25 +174,25 @@ void WDSPRxSink::feed(const SampleVector::const_iterator& begin, const SampleVec
} }
} }
void WDSPRxSink::getMagSqLevels(double& avg, double& peak, int& nbSamples) void WDSPRxSink::getMagSqLevels(double& avg, double& peak, int& nbSamples) const
{ {
avg = m_sAvg; avg = m_sAvg;
peak = m_sPeak; peak = m_sPeak;
nbSamples = m_sCount; nbSamples = m_sCount;
} }
void WDSPRxSink::processOneSample(Complex &ci) void WDSPRxSink::processOneSample(const Complex &ci)
{ {
m_rxa->get_inbuff()[2*m_inCount] = ci.imag() / SDR_RX_SCALEF; m_rxa->get_inbuff()[2*m_inCount] = ci.imag() / SDR_RX_SCALEF;
m_rxa->get_inbuff()[2*m_inCount+1] = ci.real() / SDR_RX_SCALEF; m_rxa->get_inbuff()[2*m_inCount+1] = ci.real() / SDR_RX_SCALEF;
if (++m_inCount == m_rxa->get_insize()) if (++m_inCount == m_rxa->get_insize())
{ {
WDSP::RXA::xrxa(m_rxa); m_rxa->execute();
m_sCount = m_wdspBufSize; m_sCount = m_wdspBufSize;
m_sAvg = WDSP::METER::GetMeter(*m_rxa, WDSP::RXA::RXA_S_AV); m_sAvg = m_rxa->smeter->getMeter(WDSP::RXA::RXA_S_AV);
m_sPeak = WDSP::METER::GetMeter(*m_rxa, WDSP::RXA::RXA_S_PK); m_sPeak = m_rxa->smeter->getMeter(WDSP::RXA::RXA_S_PK);
for (int i = 0; i < m_rxa->get_outsize(); i++) for (int i = 0; i < m_rxa->get_outsize(); i++)
{ {
@ -204,10 +203,10 @@ void WDSPRxSink::processOneSample(Complex &ci)
} }
else else
{ {
const double& cr = m_rxa->get_outbuff()[2*i+1]; const double& dr = m_rxa->get_outbuff()[2*i+1];
const double& ci = m_rxa->get_outbuff()[2*i]; const double& di = m_rxa->get_outbuff()[2*i];
qint16 zr = cr * 32768.0; qint16 zr = dr * 32768.0;
qint16 zi = ci * 32768.0; qint16 zi = di * 32768.0;
m_audioBuffer[m_audioBufferFill].r = zr; m_audioBuffer[m_audioBufferFill].r = zr;
m_audioBuffer[m_audioBufferFill].l = zi; m_audioBuffer[m_audioBufferFill].l = zi;
@ -219,7 +218,7 @@ void WDSPRxSink::processOneSample(Complex &ci)
else else
{ {
Real demod = (zr + zi) * 0.7; Real demod = (zr + zi) * 0.7;
qint16 sample = (qint16)(demod); auto sample = (qint16)(demod);
m_demodBuffer[m_demodBufferFill++] = sample; m_demodBuffer[m_demodBufferFill++] = sample;
} }
@ -228,13 +227,11 @@ void WDSPRxSink::processOneSample(Complex &ci)
QList<ObjectPipe*> dataPipes; QList<ObjectPipe*> dataPipes;
MainCore::instance()->getDataPipes().getDataPipes(m_channel, "demod", dataPipes); MainCore::instance()->getDataPipes().getDataPipes(m_channel, "demod", dataPipes);
if (dataPipes.size() > 0) if (!dataPipes.empty())
{ {
QList<ObjectPipe*>::iterator it = dataPipes.begin(); for (auto dataPipe : dataPipes)
for (; it != dataPipes.end(); ++it)
{ {
DataFifo *fifo = qobject_cast<DataFifo*>((*it)->m_element); DataFifo *fifo = qobject_cast<DataFifo*>(dataPipe->m_element);
if (fifo) if (fifo)
{ {
@ -306,7 +303,7 @@ void WDSPRxSink::applyAudioSampleRate(int sampleRate)
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) m_wdspSampleRate; m_interpolatorDistance = (Real) m_channelSampleRate / (Real) m_wdspSampleRate;
WDSP::RXA::setOutputSamplerate(m_rxa, sampleRate); m_rxa->setOutputSamplerate(sampleRate);
m_audioFifo.setSize(sampleRate); m_audioFifo.setSize(sampleRate);
m_audioSampleRate = sampleRate; m_audioSampleRate = sampleRate;
@ -316,7 +313,7 @@ void WDSPRxSink::applyAudioSampleRate(int sampleRate)
QList<ObjectPipe*> pipes; QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(m_channel, "reportdemod", pipes); MainCore::instance()->getMessagePipes().getMessagePipes(m_channel, "reportdemod", pipes);
if (pipes.size() > 0) if (!pipes.empty())
{ {
for (const auto& pipe : pipes) for (const auto& pipe : pipes)
{ {
@ -373,8 +370,8 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
if ((m_settings.m_rit != settings.m_rit) || (m_settings.m_ritFrequency != settings.m_ritFrequency) || force) if ((m_settings.m_rit != settings.m_rit) || (m_settings.m_ritFrequency != settings.m_ritFrequency) || force)
{ {
WDSP::SHIFT::SetShiftFreq(*m_rxa, settings.m_ritFrequency); m_rxa->shift->SetFreq(settings.m_ritFrequency);
WDSP::SHIFT::SetShiftRun(*m_rxa, settings.m_rit ? 1 : 0); m_rxa->shift->SetRun(settings.m_rit ? 1 : 0);
} }
// Filter and mode // Filter and mode
@ -385,8 +382,13 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
(m_settings.m_demod != settings.m_demod) || (m_settings.m_demod != settings.m_demod) ||
(m_settings.m_dsb != settings.m_dsb) || force) (m_settings.m_dsb != settings.m_dsb) || force)
{ {
float band, low, high, fLow, fHigh; float band;
bool usb, dsb; float low;
float high;
float fLow;
float fHigh;
bool usb;
bool dsb;
band = settings.m_profiles[settings.m_profileIndex].m_highCutoff; band = settings.m_profiles[settings.m_profileIndex].m_highCutoff;
high = band; high = band;
@ -446,34 +448,34 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) m_audioSampleRate; m_interpolatorDistance = (Real) m_channelSampleRate / (Real) m_audioSampleRate;
WDSP::RXA::SetPassband(*m_rxa, fLow, fHigh); m_rxa->setPassband(fLow, fHigh);
WDSP::NBP::NBPSetWindow(*m_rxa, m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow); m_rxa->nbpSetWindow(m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow);
if (settings.m_demod == WDSPRxProfile::DemodSSB) if (settings.m_demod == WDSPRxProfile::DemodSSB)
{ {
if (dsb) { if (dsb) {
WDSP::RXA::SetMode(*m_rxa, WDSP::RXA::RXA_DSB); m_rxa->setMode(WDSP::RXA::RXA_DSB);
} else { } else {
WDSP::RXA::SetMode(*m_rxa, usb ? WDSP::RXA::RXA_USB : WDSP::RXA::RXA_LSB); m_rxa->setMode(usb ? WDSP::RXA::RXA_USB : WDSP::RXA::RXA_LSB);
} }
} }
else if (settings.m_demod == WDSPRxProfile::DemodAM) else if (settings.m_demod == WDSPRxProfile::DemodAM)
{ {
WDSP::RXA::SetMode(*m_rxa, WDSP::RXA::RXA_AM); m_rxa->setMode(WDSP::RXA::RXA_AM);
} }
else if (settings.m_demod == WDSPRxProfile::DemodSAM) else if (settings.m_demod == WDSPRxProfile::DemodSAM)
{ {
WDSP::RXA::SetMode(*m_rxa, WDSP::RXA::RXA_SAM); m_rxa->setMode(WDSP::RXA::RXA_SAM);
if (dsb) { if (dsb) {
WDSP::AMD::SetAMDSBMode(*m_rxa, 0); m_rxa->amd->setSBMode(0);
} else { } else {
WDSP::AMD::SetAMDSBMode(*m_rxa, usb ? 2 : 1); m_rxa->amd->setSBMode(usb ? 2 : 1);
} }
} }
else if (settings.m_demod == WDSPRxProfile::DemodFMN) else if (settings.m_demod == WDSPRxProfile::DemodFMN)
{ {
WDSP::RXA::SetMode(*m_rxa, WDSP::RXA::RXA_FM); m_rxa->setMode(WDSP::RXA::RXA_FM);
} }
} }
@ -486,18 +488,18 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
if ((m_settings.m_dnr != settings.m_dnr) if ((m_settings.m_dnr != settings.m_dnr)
|| (m_settings.m_nrScheme != settings.m_nrScheme) || force) || (m_settings.m_nrScheme != settings.m_nrScheme) || force)
{ {
WDSP::ANR::SetANRRun(*m_rxa, 0); m_rxa->setANRRun(0);
WDSP::EMNR::SetEMNRRun(*m_rxa, 0); m_rxa->setEMNRRun(0);
if (settings.m_dnr) if (settings.m_dnr)
{ {
switch (settings.m_nrScheme) switch (settings.m_nrScheme)
{ {
case WDSPRxProfile::NRSchemeNR: case WDSPRxProfile::NRSchemeNR:
WDSP::ANR::SetANRRun(*m_rxa, 1); m_rxa->setANRRun(1);
break; break;
case WDSPRxProfile::NRSchemeNR2: case WDSPRxProfile::NRSchemeNR2:
WDSP::EMNR::SetEMNRRun(*m_rxa, 1); m_rxa->setEMNRRun(1);
break; break;
default: default:
break; break;
@ -510,12 +512,12 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
switch (settings.m_nrPosition) switch (settings.m_nrPosition)
{ {
case WDSPRxProfile::NRPositionPreAGC: case WDSPRxProfile::NRPositionPreAGC:
WDSP::ANR::SetANRPosition(*m_rxa, 0); m_rxa->setANRPosition(0);
WDSP::EMNR::SetEMNRPosition(*m_rxa, 0); m_rxa->setEMNRPosition(0);
break; break;
case WDSPRxProfile::NRPositionPostAGC: case WDSPRxProfile::NRPositionPostAGC:
WDSP::ANR::SetANRPosition(*m_rxa, 1); m_rxa->setANRPosition(1);
WDSP::EMNR::SetEMNRPosition(*m_rxa, 1); m_rxa->setEMNRPosition(1);
break; break;
default: default:
break; break;
@ -527,13 +529,13 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
switch (settings.m_nr2Gain) switch (settings.m_nr2Gain)
{ {
case WDSPRxProfile::NR2GainLinear: case WDSPRxProfile::NR2GainLinear:
WDSP::EMNR::SetEMNRgainMethod(*m_rxa, 0); m_rxa->emnr->setGainMethod(0);
break; break;
case WDSPRxProfile::NR2GainLog: case WDSPRxProfile::NR2GainLog:
WDSP::EMNR::SetEMNRgainMethod(*m_rxa, 1); m_rxa->emnr->setGainMethod(1);
break; break;
case WDSPRxProfile::NR2GainGamma: case WDSPRxProfile::NR2GainGamma:
WDSP::EMNR::SetEMNRgainMethod(*m_rxa, 2); m_rxa->emnr->setGainMethod(2);
break; break;
default: default:
break; break;
@ -545,10 +547,10 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
switch (settings.m_nr2NPE) switch (settings.m_nr2NPE)
{ {
case WDSPRxProfile::NR2NPEOSMS: case WDSPRxProfile::NR2NPEOSMS:
WDSP::EMNR::SetEMNRnpeMethod(*m_rxa, 0); m_rxa->emnr->setNpeMethod(0);
break; break;
case WDSPRxProfile::NR2NPEMMSE: case WDSPRxProfile::NR2NPEMMSE:
WDSP::EMNR::SetEMNRnpeMethod(*m_rxa, 1); m_rxa->emnr->setNpeMethod(1);
break; break;
default: default:
break; break;
@ -556,34 +558,34 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
} }
if ((m_settings.m_nr2ArtifactReduction != settings.m_nr2ArtifactReduction) || force) { if ((m_settings.m_nr2ArtifactReduction != settings.m_nr2ArtifactReduction) || force) {
WDSP::EMNR::SetEMNRaeRun(*m_rxa, settings.m_nr2ArtifactReduction ? 1 : 0); m_rxa->emnr->setAeRun(settings.m_nr2ArtifactReduction ? 1 : 0);
} }
if ((m_settings.m_anf != settings.m_anf) || force) { if ((m_settings.m_anf != settings.m_anf) || force) {
WDSP::ANF::SetANFRun(*m_rxa, settings.m_anf ? 1 : 0); m_rxa->setANFRun(settings.m_anf ? 1 : 0);
} }
// Caution: Causes corruption // Caution: Causes corruption
if ((m_settings.m_snb != settings.m_snb) || force) { if ((m_settings.m_snb != settings.m_snb) || force) {
WDSP::SNBA::SetSNBARun(*m_rxa, settings.m_snb ? 1 : 0); m_rxa->setSNBARun(settings.m_snb ? 1 : 0);
} }
// CW Peaking // CW Peaking
if ((m_settings.m_cwPeaking != settings.m_cwPeaking) || force) { if ((m_settings.m_cwPeaking != settings.m_cwPeaking) || force) {
WDSP::SPEAK::SetSPCWRun(*m_rxa, settings.m_cwPeaking ? 1 : 0); m_rxa->speak->setRun(settings.m_cwPeaking ? 1 : 0);
} }
if ((m_settings.m_cwPeakFrequency != settings.m_cwPeakFrequency) || force) { if ((m_settings.m_cwPeakFrequency != settings.m_cwPeakFrequency) || force) {
WDSP::SPEAK::SetSPCWFreq(*m_rxa, settings.m_cwPeakFrequency); m_rxa->speak->setFreq(settings.m_cwPeakFrequency);
} }
if ((m_settings.m_cwBandwidth != settings.m_cwBandwidth) || force) { if ((m_settings.m_cwBandwidth != settings.m_cwBandwidth) || force) {
WDSP::SPEAK::SetSPCWBandwidth(*m_rxa, settings.m_cwBandwidth); m_rxa->speak->setBandwidth(settings.m_cwBandwidth);
} }
if ((m_settings.m_cwGain != settings.m_cwGain) || force) { if ((m_settings.m_cwGain != settings.m_cwGain) || force) {
WDSP::SPEAK::SetSPCWGain(*m_rxa, settings.m_cwGain); m_rxa->speak->setGain(settings.m_cwGain);
} }
// Noise Blanker // Noise Blanker
@ -591,18 +593,18 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
if ((m_settings.m_dnb != settings.m_dnb) if ((m_settings.m_dnb != settings.m_dnb)
|| (m_settings.m_nbScheme != settings.m_nbScheme) || force) || (m_settings.m_nbScheme != settings.m_nbScheme) || force)
{ {
WDSP::ANB::SetANBRun(*m_rxa, 0); m_rxa->anb->setRun(0);
WDSP::NOB::SetNOBRun(*m_rxa, 0); m_rxa->nob->setRun(0);
if (settings.m_dnb) if (settings.m_dnb)
{ {
switch(settings.m_nbScheme) switch(settings.m_nbScheme)
{ {
case WDSPRxProfile::NBSchemeNB: case WDSPRxProfile::NBSchemeNB:
WDSP::ANB::SetANBRun(*m_rxa, 1); m_rxa->anb->setRun(1);
break; break;
case WDSPRxProfile::NBSchemeNB2: case WDSPRxProfile::NBSchemeNB2:
WDSP::NOB::SetNOBRun(*m_rxa, 1); m_rxa->nob->setRun(1);
break; break;
default: default:
break; break;
@ -612,66 +614,66 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
if ((m_settings.m_nbSlewTime != settings.m_nbSlewTime) || force) if ((m_settings.m_nbSlewTime != settings.m_nbSlewTime) || force)
{ {
WDSP::ANB::SetANBTau(*m_rxa, settings.m_nbSlewTime * 0.001); m_rxa->anb->setTau(settings.m_nbSlewTime * 0.001);
WDSP::NOB::SetNOBTau(*m_rxa, settings.m_nbSlewTime * 0.001); m_rxa->nob->setTau(settings.m_nbSlewTime * 0.001);
} }
if ((m_settings.m_nbLeadTime != settings.m_nbLeadTime) || force) if ((m_settings.m_nbLeadTime != settings.m_nbLeadTime) || force)
{ {
WDSP::ANB::SetANBAdvtime(*m_rxa, settings.m_nbLeadTime * 0.001); m_rxa->anb->setAdvtime(settings.m_nbLeadTime * 0.001);
WDSP::NOB::SetNOBAdvtime(*m_rxa, settings.m_nbLeadTime * 0.001); m_rxa->nob->setAdvtime(settings.m_nbLeadTime * 0.001);
} }
if ((m_settings.m_nbLagTime != settings.m_nbLagTime) || force) if ((m_settings.m_nbLagTime != settings.m_nbLagTime) || force)
{ {
WDSP::ANB::SetANBHangtime(*m_rxa, settings.m_nbLagTime * 0.001); m_rxa->anb->setHangtime(settings.m_nbLagTime * 0.001);
WDSP::NOB::SetNOBHangtime(*m_rxa, settings.m_nbLagTime * 0.001); m_rxa->nob->setHangtime(settings.m_nbLagTime * 0.001);
} }
if ((m_settings.m_nbThreshold != settings.m_nbThreshold) || force) if ((m_settings.m_nbThreshold != settings.m_nbThreshold) || force)
{ {
WDSP::ANB::SetANBThreshold(*m_rxa, settings.m_nbThreshold); m_rxa->anb->setThreshold(settings.m_nbThreshold);
WDSP::NOB::SetNOBThreshold(*m_rxa, settings.m_nbThreshold); m_rxa->nob->setThreshold(settings.m_nbThreshold);
} }
if ((m_settings.m_nbAvgTime != settings.m_nbAvgTime) || force) if ((m_settings.m_nbAvgTime != settings.m_nbAvgTime) || force)
{ {
WDSP::ANB::SetANBBacktau(*m_rxa, settings.m_nbAvgTime * 0.001); m_rxa->anb->setBacktau(settings.m_nbAvgTime * 0.001);
WDSP::NOB::SetNOBBacktau(*m_rxa, settings.m_nbAvgTime * 0.001); m_rxa->nob->setBacktau(settings.m_nbAvgTime * 0.001);
} }
// AM option // AM option
if ((m_settings.m_amFadeLevel != settings.m_amFadeLevel) || force) { if ((m_settings.m_amFadeLevel != settings.m_amFadeLevel) || force) {
WDSP::AMD::SetAMDFadeLevel(*m_rxa, settings.m_amFadeLevel); m_rxa->amd->setFadeLevel(settings.m_amFadeLevel);
} }
// FM options // FM options
if ((m_settings.m_fmDeviation != settings.m_fmDeviation) || force) { if ((m_settings.m_fmDeviation != settings.m_fmDeviation) || force) {
WDSP::FMD::SetFMDeviation(*m_rxa, settings.m_fmDeviation); m_rxa->fmd->setDeviation(settings.m_fmDeviation);
} }
if ((m_settings.m_fmAFLow != settings.m_fmAFLow) if ((m_settings.m_fmAFLow != settings.m_fmAFLow)
|| (m_settings.m_fmAFHigh != settings.m_fmAFHigh) || force) || (m_settings.m_fmAFHigh != settings.m_fmAFHigh) || force)
{ {
WDSP::FMD::SetFMAFFilter(*m_rxa, settings.m_fmAFLow, settings.m_fmAFHigh); m_rxa->fmd->setAFFilter(settings.m_fmAFLow, settings.m_fmAFHigh);
} }
if ((m_settings.m_fmAFLimiter != settings.m_fmAFLimiter) || force) { if ((m_settings.m_fmAFLimiter != settings.m_fmAFLimiter) || force) {
WDSP::FMD::SetFMLimRun(*m_rxa, settings.m_fmAFLimiter ? 1 : 0); m_rxa->fmd->setLimRun(settings.m_fmAFLimiter ? 1 : 0);
} }
if ((m_settings.m_fmAFLimiterGain != settings.m_fmAFLimiterGain) || force) { if ((m_settings.m_fmAFLimiterGain != settings.m_fmAFLimiterGain) || force) {
WDSP::FMD::SetFMLimGain(*m_rxa, settings.m_fmAFLimiterGain); m_rxa->fmd->setLimGain(settings.m_fmAFLimiterGain);
} }
if ((m_settings.m_fmCTCSSNotch != settings.m_fmCTCSSNotch) || force) { if ((m_settings.m_fmCTCSSNotch != settings.m_fmCTCSSNotch) || force) {
WDSP::FMD::SetCTCSSRun(*m_rxa, settings.m_fmCTCSSNotch ? 1 : 0); m_rxa->fmd->setCTCSSRun(settings.m_fmCTCSSNotch ? 1 : 0);
} }
if ((m_settings.m_fmCTCSSNotchFrequency != settings.m_fmCTCSSNotchFrequency) || force) { if ((m_settings.m_fmCTCSSNotchFrequency != settings.m_fmCTCSSNotchFrequency) || force) {
WDSP::FMD::SetCTCSSFreq(*m_rxa, settings.m_fmCTCSSNotchFrequency); m_rxa->fmd->setCTCSSFreq(settings.m_fmCTCSSNotchFrequency);
} }
// Squelch // Squelch
@ -680,9 +682,9 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
|| (m_settings.m_squelchThreshold != settings.m_squelchThreshold) || (m_settings.m_squelchThreshold != settings.m_squelchThreshold)
|| (m_settings.m_squelchMode != settings.m_squelchMode) || force) || (m_settings.m_squelchMode != settings.m_squelchMode) || force)
{ {
WDSP::SSQL::SetSSQLRun(*m_rxa, 0); m_rxa->ssql->setRun(0);
WDSP::AMSQ::SetAMSQRun(*m_rxa, 0); m_rxa->amsq->setRun(0);
WDSP::FMSQ::SetFMSQRun(*m_rxa, 0); m_rxa->fmsq->setRun(0);
if (settings.m_squelch) if (settings.m_squelch)
{ {
@ -690,24 +692,24 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
{ {
case WDSPRxProfile::SquelchModeVoice: case WDSPRxProfile::SquelchModeVoice:
{ {
WDSP::SSQL::SetSSQLRun(*m_rxa, 1); m_rxa->ssql->setRun(1);
double threshold = 0.0075 * settings.m_squelchThreshold; double threshold = 0.0075 * settings.m_squelchThreshold;
WDSP::SSQL::SetSSQLThreshold(*m_rxa, threshold); m_rxa->ssql->setThreshold(threshold);
} }
break; break;
case WDSPRxProfile::SquelchModeAM: case WDSPRxProfile::SquelchModeAM:
{ {
WDSP::AMSQ::SetAMSQRun(*m_rxa, 1); m_rxa->amsq->setRun(1);
double threshold = ((settings.m_squelchThreshold / 100.0) * 160.0) - 160.0; double threshold = ((settings.m_squelchThreshold / 100.0) * 160.0) - 160.0;
WDSP::AMSQ::SetAMSQThreshold(*m_rxa, threshold); m_rxa->amsq->setThreshold(threshold);
} }
break; break;
case WDSPRxProfile::SquelchModeFM: case WDSPRxProfile::SquelchModeFM:
{ {
WDSP::FMSQ::SetFMSQRun(*m_rxa, 1); m_rxa->fmsq->setRun(1);
double threshold = pow(10.0, -2.0 * ((double) settings.m_squelchThreshold) / 100.0); double threshold = pow(10.0, -2.0 * ((double) settings.m_squelchThreshold) / 100.0);
qDebug("WDSPRxSink::applySettings: FM squelch %lf", threshold); qDebug("WDSPRxSink::applySettings: FM squelch %lf", threshold);
WDSP::FMSQ::SetFMSQThreshold(*m_rxa, threshold); m_rxa->fmsq->setThreshold(threshold);
} }
break; break;
default: default:
@ -717,33 +719,33 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
} }
if ((m_settings.m_ssqlTauMute != settings.m_ssqlTauMute) || force) { if ((m_settings.m_ssqlTauMute != settings.m_ssqlTauMute) || force) {
WDSP::SSQL::SetSSQLTauMute(*m_rxa, settings.m_ssqlTauMute); m_rxa->ssql->setTauMute(settings.m_ssqlTauMute);
} }
if ((m_settings.m_ssqlTauUnmute != settings.m_ssqlTauUnmute) || force) { if ((m_settings.m_ssqlTauUnmute != settings.m_ssqlTauUnmute) || force) {
WDSP::SSQL::SetSSQLTauUnMute(*m_rxa, settings.m_ssqlTauUnmute); m_rxa->ssql->setTauUnMute(settings.m_ssqlTauUnmute);
} }
if ((m_settings.m_amsqMaxTail != settings.m_amsqMaxTail) || force) { if ((m_settings.m_amsqMaxTail != settings.m_amsqMaxTail) || force) {
WDSP::AMSQ::SetAMSQMaxTail(*m_rxa, settings.m_amsqMaxTail); m_rxa->amsq->setMaxTail(settings.m_amsqMaxTail);
} }
// Equalizer // Equalizer
if ((m_settings.m_equalizer != settings.m_equalizer) || force) { if ((m_settings.m_equalizer != settings.m_equalizer) || force) {
WDSP::EQP::SetEQRun(*m_rxa, settings.m_equalizer ? 1 : 0); m_rxa->eqp->setRun(settings.m_equalizer ? 1 : 0);
} }
if ((m_settings.m_eqF != settings.m_eqF) if ((m_settings.m_eqF != settings.m_eqF)
|| (m_settings.m_eqG != settings.m_eqG) || force) || (m_settings.m_eqG != settings.m_eqG) || force)
{ {
WDSP::EQP::SetEQProfile(*m_rxa, 10, settings.m_eqF.data(), settings.m_eqG.data()); m_rxa->eqp->setProfile(10, settings.m_eqF.data(), settings.m_eqG.data());
} }
// Audio panel // Audio panel
if ((m_settings.m_volume != settings.m_volume) || force) { if ((m_settings.m_volume != settings.m_volume) || force) {
WDSP::PANEL::SetPanelGain1(*m_rxa, settings.m_volume); m_rxa->panel->setGain1(settings.m_volume);
} }
if ((m_settings.m_audioBinaural != settings.m_audioBinaural) if ((m_settings.m_audioBinaural != settings.m_audioBinaural)
@ -752,13 +754,13 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
{ {
if (settings.m_audioBinaural) if (settings.m_audioBinaural)
{ {
WDSP::PANEL::SetPanelCopy(*m_rxa, settings.m_audioFlipChannels ? 3 : 0); m_rxa->panel->setCopy(settings.m_audioFlipChannels ? 3 : 0);
WDSP::PANEL::SetPanelPan(*m_rxa, settings.m_audioPan); m_rxa->panel->setPan(settings.m_audioPan);
} }
else else
{ {
WDSP::PANEL::SetPanelCopy(*m_rxa, settings.m_audioFlipChannels ? 2 : 1); m_rxa->panel->setCopy(settings.m_audioFlipChannels ? 2 : 1);
WDSP::PANEL::SetPanelPan(*m_rxa, 0.5); m_rxa->panel->setPan(0.5);
} }
} }
@ -770,46 +772,46 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
|| (m_settings.m_agcHangThreshold != settings.m_agcHangThreshold) || (m_settings.m_agcHangThreshold != settings.m_agcHangThreshold)
|| (m_settings.m_agcGain != settings.m_agcGain) || force) || (m_settings.m_agcGain != settings.m_agcGain) || force)
{ {
WDSP::WCPAGC::SetAGCSlope(*m_rxa, settings.m_agcSlope); // SetRXAAGCSlope(id, rx->agc_slope); m_rxa->agc->setSlope(settings.m_agcSlope);
WDSP::WCPAGC::SetAGCTop(*m_rxa, (float) settings.m_agcGain); // SetRXAAGCTop(id, rx->agc_gain); m_rxa->agc->setTop((float) settings.m_agcGain);
if (settings.m_agc) if (settings.m_agc)
{ {
switch (settings.m_agcMode) switch (settings.m_agcMode)
{ {
case WDSPRxProfile::WDSPRxAGCMode::AGCLong: case WDSPRxProfile::WDSPRxAGCMode::AGCLong:
WDSP::WCPAGC::SetAGCMode(*m_rxa, 1); m_rxa->agc->setMode(1);
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2); m_rxa->agc->setAttack(2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 2000); // SetRXAAGCHang(id, 2000); m_rxa->agc->setHang(2000);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 2000); // SetRXAAGCDecay(id, 2000); m_rxa->agc->setDecay(2000);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, (int)rx->agc_hang_threshold); m_rxa->agc->setHangThreshold(settings.m_agcHangThreshold);
break; break;
case WDSPRxProfile::WDSPRxAGCMode::AGCSlow: case WDSPRxProfile::WDSPRxAGCMode::AGCSlow:
WDSP::WCPAGC::SetAGCMode(*m_rxa, 2); m_rxa->agc->setMode(2);
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2); m_rxa->agc->setAttack(2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 1000); // SetRXAAGCHang(id, 1000); m_rxa->agc->setHang(1000);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 500); // SetRXAAGCDecay(id, 500); m_rxa->agc->setDecay(500);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, (int)rx->agc_hang_threshold); m_rxa->agc->setHangThreshold(settings.m_agcHangThreshold);
break; break;
case WDSPRxProfile::WDSPRxAGCMode::AGCMedium: case WDSPRxProfile::WDSPRxAGCMode::AGCMedium:
WDSP::WCPAGC::SetAGCMode(*m_rxa, 3); m_rxa->agc->setMode(3);
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2); m_rxa->agc->setAttack(2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 0); // SetRXAAGCHang(id, 0); m_rxa->agc->setHang(0);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 250); // SetRXAAGCDecay(id, 250); m_rxa->agc->setDecay(250);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, 100); m_rxa->agc->setHangThreshold(settings.m_agcHangThreshold);
break; break;
case WDSPRxProfile::WDSPRxAGCMode::AGCFast: case WDSPRxProfile::WDSPRxAGCMode::AGCFast:
WDSP::WCPAGC::SetAGCMode(*m_rxa, 4); m_rxa->agc->setMode(4);
WDSP::WCPAGC::SetAGCAttack(*m_rxa, 2); // SetRXAAGCAttack(id, 2); m_rxa->agc->setAttack(2);
WDSP::WCPAGC::SetAGCHang(*m_rxa, 0); // SetRXAAGCHang(id, 0); m_rxa->agc->setHang(0);
WDSP::WCPAGC::SetAGCDecay(*m_rxa, 50); // SetRXAAGCDecay(id, 50); m_rxa->agc->setDecay(50);
WDSP::WCPAGC::SetAGCHangThreshold(*m_rxa, settings.m_agcHangThreshold); // SetRXAAGCHangThreshold(id, 100); m_rxa->agc->setHangThreshold(settings.m_agcHangThreshold);
break; break;
} }
} }
else else
{ {
WDSP::WCPAGC::SetAGCMode(*m_rxa, 0); m_rxa->agc->setMode(0);
} }
} }

View File

@ -55,13 +55,14 @@ public:
bool getAudioActive() const { return m_audioActive; } bool getAudioActive() const { return m_audioActive; }
void setChannel(ChannelAPI *channel) { m_channel = channel; } void setChannel(ChannelAPI *channel) { m_channel = channel; }
void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); } void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); }
void getMagSqLevels(double& avg, double& peak, int& nbSamples); void getMagSqLevels(double& avg, double& peak, int& nbSamples) const;
private: private:
class SpectrumProbe : public WDSP::BufferProbe class SpectrumProbe : public WDSP::BufferProbe
{ {
public: public:
SpectrumProbe(SampleVector& sampleVector); explicit SpectrumProbe(SampleVector& sampleVector);
virtual ~SpectrumProbe() = default;
virtual void proceed(const float *in, int nbSamples); virtual void proceed(const float *in, int nbSamples);
void setSpanLog2(int spanLog2); void setSpanLog2(int spanLog2);
void setDSB(bool dsb) { m_dsb = dsb; } void setDSB(bool dsb) { m_dsb = dsb; }
@ -102,8 +103,6 @@ private:
Interpolator m_interpolator; Interpolator m_interpolator;
Real m_interpolatorDistance; Real m_interpolatorDistance;
Real m_interpolatorDistanceRemain; Real m_interpolatorDistanceRemain;
// fftfilt* SSBFilter;
// fftfilt* DSBFilter;
SpectrumVis* m_spectrumSink; SpectrumVis* m_spectrumSink;
SampleVector m_sampleBuffer; SampleVector m_sampleBuffer;
@ -123,7 +122,7 @@ private:
static const int m_wdspSampleRate; static const int m_wdspSampleRate;
static const int m_wdspBufSize; static const int m_wdspBufSize;
void processOneSample(Complex &ci); void processOneSample(const Complex &ci);
}; };
#endif // INCLUDE_SSBDEMODSINK_H #endif // INCLUDE_SSBDEMODSINK_H

View File

@ -33,7 +33,7 @@
const PluginDescriptor IEEE_802_15_4_ModPlugin::m_pluginDescriptor = { const PluginDescriptor IEEE_802_15_4_ModPlugin::m_pluginDescriptor = {
IEEE_802_15_4_Mod::m_channelId, IEEE_802_15_4_Mod::m_channelId,
QStringLiteral("802.15.4 Modulator"), QStringLiteral("802.15.4 Modulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor AISModPlugin::m_pluginDescriptor = { const PluginDescriptor AISModPlugin::m_pluginDescriptor = {
AISMod::m_channelId, AISMod::m_channelId,
QStringLiteral("AIS Modulator"), QStringLiteral("AIS Modulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor ATVModPlugin::m_pluginDescriptor = { const PluginDescriptor ATVModPlugin::m_pluginDescriptor = {
ATVMod::m_channelId, ATVMod::m_channelId,
QStringLiteral("ATV Modulator"), QStringLiteral("ATV Modulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor ChirpChatModPlugin::m_pluginDescriptor = { const PluginDescriptor ChirpChatModPlugin::m_pluginDescriptor = {
ChirpChatMod::m_channelId, ChirpChatMod::m_channelId,
QStringLiteral("ChirpChat Modulator"), QStringLiteral("ChirpChat Modulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,7 +29,7 @@
const PluginDescriptor DATVModPlugin::m_pluginDescriptor = { const PluginDescriptor DATVModPlugin::m_pluginDescriptor = {
DATVMod::m_channelId, DATVMod::m_channelId,
QStringLiteral("DATV Modulator"), QStringLiteral("DATV Modulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE, Edouard Griffiths, F4EXB. DVB-S2 by G4GUO"), QStringLiteral("(c) Jon Beniston, M7RCE, Edouard Griffiths, F4EXB. DVB-S2 by G4GUO"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor M17ModPlugin::m_pluginDescriptor = { const PluginDescriptor M17ModPlugin::m_pluginDescriptor = {
M17Mod::m_channelId, M17Mod::m_channelId,
QStringLiteral("M17 Modulator"), QStringLiteral("M17 Modulator"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor PacketModPlugin::m_pluginDescriptor = { const PluginDescriptor PacketModPlugin::m_pluginDescriptor = {
PacketMod::m_channelId, PacketMod::m_channelId,
QStringLiteral("Packet Modulator"), QStringLiteral("Packet Modulator"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,7 +31,7 @@
const PluginDescriptor AMBEPlugin::m_pluginDescriptor = { const PluginDescriptor AMBEPlugin::m_pluginDescriptor = {
AMBE::m_featureId, AMBE::m_featureId,
QStringLiteral("AMBE Controller"), QStringLiteral("AMBE Controller"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor APRSPlugin::m_pluginDescriptor = { const PluginDescriptor APRSPlugin::m_pluginDescriptor = {
APRS::m_featureId, APRS::m_featureId,
QStringLiteral("APRS"), QStringLiteral("APRS"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor GS232ControllerPlugin::m_pluginDescriptor = { const PluginDescriptor GS232ControllerPlugin::m_pluginDescriptor = {
GS232Controller::m_featureId, GS232Controller::m_featureId,
QStringLiteral("Rotator Controller"), QStringLiteral("Rotator Controller"),
QStringLiteral("7.21.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,7 +31,7 @@
const PluginDescriptor LimeRFEPlugin::m_pluginDescriptor = { const PluginDescriptor LimeRFEPlugin::m_pluginDescriptor = {
LimeRFE::m_featureId, LimeRFE::m_featureId,
QStringLiteral("LimeRFE USB Controller"), QStringLiteral("LimeRFE USB Controller"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor MapPlugin::m_pluginDescriptor = { const PluginDescriptor MapPlugin::m_pluginDescriptor = {
Map::m_featureId, Map::m_featureId,
QStringLiteral("Map"), QStringLiteral("Map"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,7 +28,7 @@
const PluginDescriptor MorseDecoderPlugin::m_pluginDescriptor = { const PluginDescriptor MorseDecoderPlugin::m_pluginDescriptor = {
MorseDecoder::m_featureId, MorseDecoder::m_featureId,
QStringLiteral("Morse Decoder"), QStringLiteral("Morse Decoder"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor RadiosondePlugin::m_pluginDescriptor = { const PluginDescriptor RadiosondePlugin::m_pluginDescriptor = {
Radiosonde::m_featureId, Radiosonde::m_featureId,
QStringLiteral("Radiosonde"), QStringLiteral("Radiosonde"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,7 +31,7 @@
const PluginDescriptor RigCtlServerPlugin::m_pluginDescriptor = { const PluginDescriptor RigCtlServerPlugin::m_pluginDescriptor = {
RigCtlServer::m_featureId, RigCtlServer::m_featureId,
QStringLiteral("RigCtl Server"), QStringLiteral("RigCtl Server"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE and Edouard Griffiths, F4EXB"), QStringLiteral("(c) Jon Beniston, M7RCE and Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor SatelliteTrackerPlugin::m_pluginDescriptor = { const PluginDescriptor SatelliteTrackerPlugin::m_pluginDescriptor = {
SatelliteTracker::m_featureId, SatelliteTracker::m_featureId,
QStringLiteral("Satellite Tracker"), QStringLiteral("Satellite Tracker"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE and Daniel Warner (SGP4 library)"), QStringLiteral("(c) Jon Beniston, M7RCE and Daniel Warner (SGP4 library)"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,7 +29,7 @@
const PluginDescriptor SIDPlugin::m_pluginDescriptor = { const PluginDescriptor SIDPlugin::m_pluginDescriptor = {
SIDMain::m_featureId, SIDMain::m_featureId,
QStringLiteral("SID"), QStringLiteral("SID"),
QStringLiteral("7.21.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor SkyMapPlugin::m_pluginDescriptor = { const PluginDescriptor SkyMapPlugin::m_pluginDescriptor = {
SkyMap::m_featureId, SkyMap::m_featureId,
QStringLiteral("Sky Map"), QStringLiteral("Sky Map"),
QStringLiteral("7.21.2"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,7 +34,7 @@
const PluginDescriptor StarTrackerPlugin::m_pluginDescriptor = { const PluginDescriptor StarTrackerPlugin::m_pluginDescriptor = {
StarTracker::m_featureId, StarTracker::m_featureId,
QStringLiteral("Star Tracker"), QStringLiteral("Star Tracker"),
QStringLiteral("7.21.3"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor VORLocalizerPlugin::m_pluginDescriptor = { const PluginDescriptor VORLocalizerPlugin::m_pluginDescriptor = {
VORLocalizer::m_featureId, VORLocalizer::m_featureId,
QStringLiteral("VOR Localizer"), QStringLiteral("VOR Localizer"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -217,7 +217,6 @@ void AudioOutput::applySettings(const AudioOutputSettings& settings, const QList
m_audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_deviceName); m_audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_deviceName);
//qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex);
audioDeviceManager->removeAudioSink(&m_audioFifo); audioDeviceManager->removeAudioSink(&m_audioFifo);
audioDeviceManager->addAudioSink(&m_audioFifo, getInputMessageQueue(), m_audioDeviceIndex);
m_sampleRate = audioDeviceManager->getOutputSampleRate(m_audioDeviceIndex); m_sampleRate = audioDeviceManager->getOutputSampleRate(m_audioDeviceIndex);
forwardChange = true; forwardChange = true;
} }

View File

@ -33,7 +33,7 @@
const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = {
QStringLiteral("PlutoSDR"), QStringLiteral("PlutoSDR"),
QStringLiteral("PlutoSDR Output"), QStringLiteral("PlutoSDR Output"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor AaroniaRTSAInputPlugin::m_pluginDescriptor = { const PluginDescriptor AaroniaRTSAInputPlugin::m_pluginDescriptor = {
QStringLiteral("AaroniaRTSA"), QStringLiteral("AaroniaRTSA"),
QStringLiteral("AaroniaRTSA input"), QStringLiteral("AaroniaRTSA input"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -250,7 +250,6 @@ void AudioInput::applySettings(const AudioInputSettings& settings, QList<QString
} }
audioDeviceManager->removeAudioSource(&m_fifo); audioDeviceManager->removeAudioSource(&m_fifo);
audioDeviceManager->addAudioSource(&m_fifo, getInputMessageQueue(), m_audioDeviceIndex);
m_sampleRate = audioDeviceManager->getInputSampleRate(m_audioDeviceIndex); m_sampleRate = audioDeviceManager->getInputSampleRate(m_audioDeviceIndex);
qDebug("AudioInput::applySettings: audioDeviceName: %s audioDeviceIndex: %d sampleRate: %d", qDebug("AudioInput::applySettings: audioDeviceName: %s audioDeviceIndex: %d sampleRate: %d",
qPrintable(settings.m_deviceName), m_audioDeviceIndex, m_sampleRate); qPrintable(settings.m_deviceName), m_audioDeviceIndex, m_sampleRate);

View File

@ -34,7 +34,7 @@
const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = { const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = {
QStringLiteral("BladeRF2"), QStringLiteral("BladeRF2"),
QStringLiteral("BladeRF2 Input"), QStringLiteral("BladeRF2 Input"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -35,7 +35,7 @@ class DeviceAPI;
const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = {
QStringLiteral("PlutoSDR"), QStringLiteral("PlutoSDR"),
QStringLiteral("PlutoSDR Input"), QStringLiteral("PlutoSDR Input"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,7 +32,7 @@
const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = {
QStringLiteral("RemoteInput"), QStringLiteral("RemoteInput"),
QStringLiteral("Remote device input"), QStringLiteral("Remote device input"),
QStringLiteral("7.21.4"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,7 +33,7 @@
const PluginDescriptor RemoteTCPInputPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteTCPInputPlugin::m_pluginDescriptor = {
QStringLiteral("RemoteTCPInput"), QStringLiteral("RemoteTCPInput"),
QStringLiteral("Remote TCP device input"), QStringLiteral("Remote TCP device input"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Jon Beniston, M7RCE"), QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -39,7 +39,7 @@
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = { const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
QStringLiteral("RTLSDR"), QStringLiteral("RTLSDR"),
QStringLiteral("RTL-SDR Input"), QStringLiteral("RTL-SDR Input"),
QStringLiteral("7.20.0"), QStringLiteral("7.22.0"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"), QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"), QStringLiteral("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -69,6 +69,9 @@ QHash<QString, const float *> ColorMap::m_colorMaps{
{"Shrimp", &m_shrimp[0]}, {"Shrimp", &m_shrimp[0]},
{"Cubehelix", &m_cubehelix[0]}, {"Cubehelix", &m_cubehelix[0]},
{"Cubegamma", &m_cubegamma[0]}, {"Cubegamma", &m_cubegamma[0]},
{"Cubehlx2", &m_cubehlx2[0]},
{"Icy", &m_icy[0]},
{"Mint", &m_mint[0]},
}; };
const float ColorMap::m_angel[m_size] = const float ColorMap::m_angel[m_size] =
@ -6313,3 +6316,789 @@ const float ColorMap::m_cubegamma[m_size] =
1.000, 0.998, 0.999, 1.000, 0.998, 0.999,
1.000, 1.000, 1.000, 1.000, 1.000, 1.000,
}; };
// Generated with https://people.phy.cam.ac.uk/dag9/CUBEHELIX/cubetry.html
// Using: Start color: 1.5, Number of rotations: -1.0, Rotation direction: negative, Hue: 1.0, Gamma: 0.7
const float ColorMap::m_cubehlx2[m_size] =
{
0.000, 0.000, 0.000,
0.023, 0.023, 0.001,
0.037, 0.038, 0.002,
0.051, 0.049, 0.003,
0.063, 0.060, 0.004,
0.075, 0.069, 0.005,
0.086, 0.078, 0.007,
0.098, 0.086, 0.009,
0.109, 0.093, 0.010,
0.120, 0.100, 0.013,
0.131, 0.107, 0.015,
0.141, 0.113, 0.017,
0.152, 0.119, 0.020,
0.163, 0.124, 0.022,
0.173, 0.129, 0.025,
0.184, 0.134, 0.028,
0.195, 0.139, 0.032,
0.205, 0.144, 0.035,
0.216, 0.148, 0.039,
0.226, 0.152, 0.043,
0.237, 0.156, 0.047,
0.247, 0.160, 0.051,
0.257, 0.164, 0.055,
0.267, 0.167, 0.060,
0.278, 0.171, 0.065,
0.288, 0.174, 0.070,
0.298, 0.177, 0.075,
0.308, 0.181, 0.080,
0.318, 0.184, 0.085,
0.328, 0.186, 0.091,
0.337, 0.189, 0.097,
0.347, 0.192, 0.103,
0.357, 0.195, 0.109,
0.366, 0.197, 0.116,
0.375, 0.200, 0.122,
0.385, 0.202, 0.129,
0.394, 0.205, 0.136,
0.403, 0.207, 0.143,
0.412, 0.210, 0.150,
0.421, 0.212, 0.158,
0.429, 0.214, 0.165,
0.438, 0.217, 0.173,
0.446, 0.219, 0.181,
0.454, 0.221, 0.189,
0.462, 0.224, 0.197,
0.470, 0.226, 0.205,
0.478, 0.228, 0.214,
0.486, 0.230, 0.222,
0.493, 0.233, 0.231,
0.501, 0.235, 0.239,
0.508, 0.237, 0.248,
0.515, 0.240, 0.257,
0.522, 0.242, 0.266,
0.528, 0.244, 0.276,
0.535, 0.247, 0.285,
0.541, 0.249, 0.294,
0.547, 0.252, 0.304,
0.553, 0.254, 0.313,
0.559, 0.257, 0.323,
0.565, 0.259, 0.332,
0.570, 0.262, 0.342,
0.575, 0.265, 0.352,
0.580, 0.267, 0.362,
0.585, 0.270, 0.372,
0.590, 0.273, 0.381,
0.594, 0.276, 0.391,
0.599, 0.279, 0.401,
0.603, 0.282, 0.411,
0.607, 0.285, 0.421,
0.610, 0.288, 0.431,
0.614, 0.291, 0.441,
0.617, 0.295, 0.451,
0.621, 0.298, 0.461,
0.624, 0.301, 0.471,
0.626, 0.305, 0.481,
0.629, 0.308, 0.491,
0.632, 0.312, 0.500,
0.634, 0.316, 0.510,
0.636, 0.319, 0.520,
0.638, 0.323, 0.530,
0.640, 0.327, 0.539,
0.641, 0.331, 0.549,
0.643, 0.335, 0.558,
0.644, 0.339, 0.568,
0.645, 0.343, 0.577,
0.646, 0.348, 0.586,
0.647, 0.352, 0.595,
0.648, 0.356, 0.604,
0.648, 0.361, 0.613,
0.649, 0.365, 0.622,
0.649, 0.370, 0.631,
0.649, 0.375, 0.639,
0.649, 0.380, 0.648,
0.649, 0.384, 0.656,
0.648, 0.389, 0.665,
0.648, 0.394, 0.673,
0.648, 0.399, 0.681,
0.647, 0.404, 0.688,
0.646, 0.409, 0.696,
0.645, 0.415, 0.704,
0.644, 0.420, 0.711,
0.643, 0.425, 0.718,
0.642, 0.431, 0.726,
0.641, 0.436, 0.732,
0.640, 0.442, 0.739,
0.638, 0.447, 0.746,
0.637, 0.453, 0.752,
0.635, 0.458, 0.759,
0.634, 0.464, 0.765,
0.632, 0.470, 0.771,
0.630, 0.476, 0.776,
0.629, 0.481, 0.782,
0.627, 0.487, 0.787,
0.625, 0.493, 0.793,
0.623, 0.499, 0.798,
0.621, 0.505, 0.803,
0.620, 0.511, 0.807,
0.618, 0.517, 0.812,
0.616, 0.523, 0.816,
0.614, 0.529, 0.821,
0.612, 0.535, 0.825,
0.610, 0.541, 0.828,
0.608, 0.547, 0.832,
0.606, 0.553, 0.836,
0.604, 0.560, 0.839,
0.602, 0.566, 0.842,
0.601, 0.572, 0.845,
0.599, 0.578, 0.848,
0.597, 0.584, 0.850,
0.595, 0.590, 0.853,
0.594, 0.596, 0.855,
0.592, 0.602, 0.857,
0.591, 0.609, 0.859,
0.589, 0.615, 0.861,
0.588, 0.621, 0.862,
0.586, 0.627, 0.864,
0.585, 0.633, 0.865,
0.584, 0.639, 0.866,
0.582, 0.645, 0.867,
0.581, 0.651, 0.868,
0.580, 0.657, 0.869,
0.579, 0.663, 0.870,
0.579, 0.669, 0.870,
0.578, 0.674, 0.870,
0.577, 0.680, 0.871,
0.577, 0.686, 0.871,
0.576, 0.692, 0.871,
0.576, 0.697, 0.870,
0.576, 0.703, 0.870,
0.576, 0.709, 0.870,
0.576, 0.714, 0.869,
0.576, 0.720, 0.869,
0.576, 0.725, 0.868,
0.577, 0.731, 0.867,
0.577, 0.736, 0.866,
0.578, 0.741, 0.865,
0.578, 0.746, 0.864,
0.579, 0.751, 0.863,
0.580, 0.757, 0.862,
0.581, 0.762, 0.861,
0.583, 0.767, 0.860,
0.584, 0.771, 0.858,
0.586, 0.776, 0.857,
0.587, 0.781, 0.855,
0.589, 0.786, 0.854,
0.591, 0.790, 0.852,
0.593, 0.795, 0.851,
0.595, 0.799, 0.849,
0.597, 0.804, 0.848,
0.600, 0.808, 0.846,
0.602, 0.812, 0.845,
0.605, 0.817, 0.843,
0.608, 0.821, 0.841,
0.611, 0.825, 0.840,
0.614, 0.829, 0.838,
0.617, 0.832, 0.837,
0.620, 0.836, 0.835,
0.624, 0.840, 0.834,
0.627, 0.844, 0.832,
0.631, 0.847, 0.831,
0.635, 0.851, 0.829,
0.639, 0.854, 0.828,
0.643, 0.858, 0.827,
0.647, 0.861, 0.825,
0.651, 0.864, 0.824,
0.655, 0.867, 0.823,
0.660, 0.870, 0.822,
0.664, 0.873, 0.821,
0.669, 0.876, 0.820,
0.674, 0.879, 0.819,
0.679, 0.882, 0.818,
0.683, 0.885, 0.818,
0.688, 0.887, 0.817,
0.693, 0.890, 0.817,
0.699, 0.892, 0.816,
0.704, 0.895, 0.816,
0.709, 0.897, 0.816,
0.714, 0.899, 0.816,
0.720, 0.902, 0.815,
0.725, 0.904, 0.816,
0.731, 0.906, 0.816,
0.736, 0.908, 0.816,
0.742, 0.910, 0.816,
0.748, 0.912, 0.817,
0.753, 0.914, 0.818,
0.759, 0.916, 0.818,
0.765, 0.918, 0.819,
0.771, 0.920, 0.820,
0.776, 0.922, 0.821,
0.782, 0.923, 0.823,
0.788, 0.925, 0.824,
0.794, 0.927, 0.826,
0.800, 0.928, 0.827,
0.806, 0.930, 0.829,
0.811, 0.932, 0.831,
0.817, 0.933, 0.833,
0.823, 0.935, 0.835,
0.829, 0.936, 0.837,
0.835, 0.938, 0.840,
0.840, 0.939, 0.842,
0.846, 0.941, 0.845,
0.852, 0.942, 0.848,
0.857, 0.944, 0.851,
0.863, 0.945, 0.854,
0.869, 0.946, 0.857,
0.874, 0.948, 0.860,
0.880, 0.949, 0.863,
0.885, 0.951, 0.867,
0.890, 0.952, 0.871,
0.896, 0.954, 0.874,
0.901, 0.955, 0.878,
0.906, 0.956, 0.882,
0.911, 0.958, 0.886,
0.916, 0.959, 0.890,
0.921, 0.961, 0.894,
0.926, 0.962, 0.899,
0.930, 0.964, 0.903,
0.935, 0.966, 0.908,
0.940, 0.967, 0.912,
0.944, 0.969, 0.917,
0.948, 0.970, 0.922,
0.953, 0.972, 0.927,
0.957, 0.974, 0.932,
0.961, 0.976, 0.937,
0.965, 0.977, 0.942,
0.968, 0.979, 0.947,
0.972, 0.981, 0.952,
0.976, 0.983, 0.957,
0.979, 0.985, 0.962,
0.983, 0.987, 0.968,
0.986, 0.989, 0.973,
0.989, 0.991, 0.978,
0.992, 0.993, 0.984,
0.995, 0.995, 0.989,
0.997, 0.998, 0.995,
1.000, 1.000, 1.000,
};
// Generated with https://people.phy.cam.ac.uk/dag9/CUBEHELIX/cubetry.html
// Using: Start color: 3.0, Number of rotations: -0.5, Rotation direction: negative, Hue: 1.0, Gamma: 0.7
const float ColorMap::m_icy[m_size] =
{
0.000, 0.000, 0.000,
0.019, 0.018, 0.041,
0.030, 0.029, 0.066,
0.040, 0.039, 0.087,
0.048, 0.048, 0.105,
0.056, 0.057, 0.123,
0.063, 0.065, 0.139,
0.070, 0.073, 0.154,
0.076, 0.080, 0.168,
0.081, 0.088, 0.182,
0.087, 0.095, 0.195,
0.092, 0.103, 0.207,
0.096, 0.110, 0.219,
0.101, 0.117, 0.231,
0.105, 0.124, 0.242,
0.110, 0.130, 0.253,
0.113, 0.137, 0.263,
0.117, 0.144, 0.273,
0.121, 0.151, 0.283,
0.124, 0.157, 0.293,
0.128, 0.164, 0.302,
0.131, 0.171, 0.311,
0.134, 0.177, 0.320,
0.137, 0.184, 0.329,
0.140, 0.190, 0.337,
0.143, 0.196, 0.345,
0.146, 0.203, 0.353,
0.148, 0.209, 0.361,
0.151, 0.216, 0.369,
0.153, 0.222, 0.376,
0.156, 0.228, 0.383,
0.158, 0.235, 0.390,
0.160, 0.241, 0.397,
0.162, 0.247, 0.404,
0.165, 0.253, 0.410,
0.167, 0.260, 0.417,
0.169, 0.266, 0.423,
0.171, 0.272, 0.429,
0.173, 0.278, 0.435,
0.175, 0.284, 0.441,
0.177, 0.290, 0.446,
0.179, 0.297, 0.452,
0.180, 0.303, 0.457,
0.182, 0.309, 0.462,
0.184, 0.315, 0.467,
0.186, 0.321, 0.472,
0.188, 0.327, 0.477,
0.189, 0.333, 0.481,
0.191, 0.339, 0.486,
0.193, 0.345, 0.490,
0.194, 0.351, 0.495,
0.196, 0.357, 0.499,
0.198, 0.362, 0.503,
0.200, 0.368, 0.507,
0.201, 0.374, 0.511,
0.203, 0.380, 0.515,
0.205, 0.386, 0.518,
0.206, 0.392, 0.522,
0.208, 0.397, 0.525,
0.210, 0.403, 0.529,
0.212, 0.409, 0.532,
0.213, 0.415, 0.535,
0.215, 0.420, 0.538,
0.217, 0.426, 0.541,
0.219, 0.431, 0.544,
0.220, 0.437, 0.547,
0.222, 0.443, 0.549,
0.224, 0.448, 0.552,
0.226, 0.454, 0.554,
0.228, 0.459, 0.557,
0.230, 0.465, 0.559,
0.232, 0.470, 0.561,
0.234, 0.475, 0.564,
0.236, 0.481, 0.566,
0.238, 0.486, 0.568,
0.240, 0.491, 0.570,
0.242, 0.497, 0.572,
0.244, 0.502, 0.574,
0.246, 0.507, 0.575,
0.248, 0.512, 0.577,
0.251, 0.518, 0.579,
0.253, 0.523, 0.580,
0.255, 0.528, 0.582,
0.257, 0.533, 0.583,
0.260, 0.538, 0.585,
0.262, 0.543, 0.586,
0.265, 0.548, 0.587,
0.267, 0.553, 0.589,
0.270, 0.558, 0.590,
0.272, 0.563, 0.591,
0.275, 0.567, 0.592,
0.278, 0.572, 0.593,
0.280, 0.577, 0.594,
0.283, 0.582, 0.595,
0.286, 0.586, 0.596,
0.289, 0.591, 0.597,
0.291, 0.596, 0.598,
0.294, 0.600, 0.599,
0.297, 0.605, 0.600,
0.300, 0.609, 0.600,
0.303, 0.614, 0.601,
0.306, 0.618, 0.602,
0.309, 0.623, 0.603,
0.313, 0.627, 0.603,
0.316, 0.631, 0.604,
0.319, 0.636, 0.604,
0.322, 0.640, 0.605,
0.326, 0.644, 0.606,
0.329, 0.648, 0.606,
0.333, 0.653, 0.607,
0.336, 0.657, 0.607,
0.340, 0.661, 0.608,
0.343, 0.665, 0.608,
0.347, 0.669, 0.609,
0.351, 0.673, 0.609,
0.354, 0.677, 0.610,
0.358, 0.681, 0.610,
0.362, 0.685, 0.611,
0.366, 0.688, 0.611,
0.370, 0.692, 0.612,
0.374, 0.696, 0.612,
0.378, 0.700, 0.612,
0.382, 0.703, 0.613,
0.386, 0.707, 0.613,
0.390, 0.711, 0.614,
0.394, 0.714, 0.614,
0.398, 0.718, 0.615,
0.402, 0.721, 0.615,
0.407, 0.725, 0.616,
0.411, 0.728, 0.616,
0.415, 0.731, 0.617,
0.420, 0.735, 0.617,
0.424, 0.738, 0.618,
0.429, 0.741, 0.619,
0.433, 0.744, 0.619,
0.438, 0.748, 0.620,
0.443, 0.751, 0.620,
0.447, 0.754, 0.621,
0.452, 0.757, 0.622,
0.457, 0.760, 0.622,
0.461, 0.763, 0.623,
0.466, 0.766, 0.624,
0.471, 0.769, 0.625,
0.476, 0.772, 0.625,
0.481, 0.775, 0.626,
0.486, 0.778, 0.627,
0.491, 0.781, 0.628,
0.496, 0.783, 0.629,
0.501, 0.786, 0.630,
0.506, 0.789, 0.631,
0.511, 0.792, 0.632,
0.516, 0.794, 0.633,
0.521, 0.797, 0.634,
0.526, 0.799, 0.635,
0.531, 0.802, 0.636,
0.536, 0.805, 0.638,
0.542, 0.807, 0.639,
0.547, 0.810, 0.640,
0.552, 0.812, 0.642,
0.557, 0.815, 0.643,
0.563, 0.817, 0.644,
0.568, 0.819, 0.646,
0.573, 0.822, 0.647,
0.578, 0.824, 0.649,
0.584, 0.826, 0.651,
0.589, 0.829, 0.652,
0.595, 0.831, 0.654,
0.600, 0.833, 0.656,
0.605, 0.835, 0.657,
0.611, 0.837, 0.659,
0.616, 0.840, 0.661,
0.622, 0.842, 0.663,
0.627, 0.844, 0.665,
0.632, 0.846, 0.667,
0.638, 0.848, 0.669,
0.643, 0.850, 0.671,
0.649, 0.852, 0.674,
0.654, 0.854, 0.676,
0.660, 0.856, 0.678,
0.665, 0.858, 0.680,
0.671, 0.860, 0.683,
0.676, 0.862, 0.685,
0.681, 0.864, 0.688,
0.687, 0.866, 0.690,
0.692, 0.868, 0.693,
0.698, 0.869, 0.696,
0.703, 0.871, 0.698,
0.709, 0.873, 0.701,
0.714, 0.875, 0.704,
0.719, 0.877, 0.707,
0.725, 0.879, 0.710,
0.730, 0.880, 0.713,
0.735, 0.882, 0.716,
0.741, 0.884, 0.719,
0.746, 0.886, 0.722,
0.751, 0.887, 0.725,
0.757, 0.889, 0.729,
0.762, 0.891, 0.732,
0.767, 0.893, 0.735,
0.772, 0.894, 0.739,
0.778, 0.896, 0.742,
0.783, 0.898, 0.746,
0.788, 0.900, 0.749,
0.793, 0.901, 0.753,
0.798, 0.903, 0.757,
0.803, 0.905, 0.760,
0.808, 0.906, 0.764,
0.813, 0.908, 0.768,
0.818, 0.910, 0.772,
0.823, 0.911, 0.776,
0.828, 0.913, 0.780,
0.833, 0.915, 0.784,
0.838, 0.917, 0.788,
0.842, 0.918, 0.792,
0.847, 0.920, 0.796,
0.852, 0.922, 0.801,
0.857, 0.923, 0.805,
0.861, 0.925, 0.809,
0.866, 0.927, 0.814,
0.870, 0.929, 0.818,
0.875, 0.930, 0.822,
0.879, 0.932, 0.827,
0.884, 0.934, 0.832,
0.888, 0.936, 0.836,
0.892, 0.937, 0.841,
0.897, 0.939, 0.845,
0.901, 0.941, 0.850,
0.905, 0.943, 0.855,
0.909, 0.945, 0.860,
0.913, 0.946, 0.865,
0.917, 0.948, 0.869,
0.921, 0.950, 0.874,
0.925, 0.952, 0.879,
0.929, 0.954, 0.884,
0.933, 0.956, 0.889,
0.937, 0.958, 0.894,
0.941, 0.960, 0.899,
0.944, 0.962, 0.904,
0.948, 0.964, 0.910,
0.951, 0.965, 0.915,
0.955, 0.967, 0.920,
0.958, 0.970, 0.925,
0.962, 0.972, 0.930,
0.965, 0.974, 0.936,
0.968, 0.976, 0.941,
0.971, 0.978, 0.946,
0.975, 0.980, 0.951,
0.978, 0.982, 0.957,
0.981, 0.984, 0.962,
0.984, 0.986, 0.967,
0.986, 0.989, 0.973,
0.989, 0.991, 0.978,
0.992, 0.993, 0.984,
0.995, 0.995, 0.989,
0.997, 0.998, 0.995,
1.000, 1.000, 1.000,
};
// Generated with https://people.phy.cam.ac.uk/dag9/CUBEHELIX/cubetry.html
// Using: Start color: 2.75, Number of rotations: -0.5, Rotation direction: negative, Hue: 1.0, Gamma: 0.7
const float ColorMap::m_mint[m_size] =
{
0.000, 0.000, 0.000,
0.010, 0.023, 0.038,
0.016, 0.037, 0.061,
0.022, 0.050, 0.080,
0.026, 0.061, 0.097,
0.031, 0.071, 0.113,
0.035, 0.081, 0.127,
0.038, 0.091, 0.141,
0.042, 0.100, 0.153,
0.045, 0.109, 0.165,
0.048, 0.118, 0.177,
0.051, 0.127, 0.188,
0.054, 0.135, 0.198,
0.057, 0.143, 0.208,
0.060, 0.151, 0.217,
0.062, 0.159, 0.227,
0.065, 0.167, 0.235,
0.067, 0.175, 0.244,
0.069, 0.183, 0.252,
0.072, 0.190, 0.260,
0.074, 0.198, 0.267,
0.076, 0.205, 0.275,
0.078, 0.213, 0.282,
0.081, 0.220, 0.289,
0.083, 0.227, 0.295,
0.085, 0.234, 0.302,
0.087, 0.241, 0.308,
0.089, 0.248, 0.314,
0.091, 0.255, 0.320,
0.093, 0.262, 0.325,
0.095, 0.269, 0.331,
0.097, 0.276, 0.336,
0.099, 0.282, 0.341,
0.101, 0.289, 0.346,
0.103, 0.296, 0.351,
0.105, 0.302, 0.356,
0.107, 0.309, 0.360,
0.109, 0.315, 0.364,
0.111, 0.322, 0.369,
0.113, 0.328, 0.373,
0.115, 0.335, 0.377,
0.117, 0.341, 0.380,
0.119, 0.347, 0.384,
0.121, 0.354, 0.388,
0.124, 0.360, 0.391,
0.126, 0.366, 0.394,
0.128, 0.372, 0.398,
0.130, 0.378, 0.401,
0.132, 0.384, 0.404,
0.135, 0.390, 0.407,
0.137, 0.396, 0.409,
0.139, 0.402, 0.412,
0.141, 0.408, 0.415,
0.144, 0.413, 0.417,
0.146, 0.419, 0.420,
0.149, 0.425, 0.422,
0.151, 0.431, 0.424,
0.154, 0.436, 0.426,
0.156, 0.442, 0.428,
0.159, 0.447, 0.430,
0.162, 0.453, 0.432,
0.164, 0.458, 0.434,
0.167, 0.464, 0.436,
0.170, 0.469, 0.438,
0.172, 0.474, 0.439,
0.175, 0.480, 0.441,
0.178, 0.485, 0.443,
0.181, 0.490, 0.444,
0.184, 0.495, 0.446,
0.187, 0.500, 0.447,
0.190, 0.505, 0.448,
0.193, 0.510, 0.450,
0.196, 0.515, 0.451,
0.200, 0.520, 0.452,
0.203, 0.525, 0.453,
0.206, 0.530, 0.454,
0.210, 0.535, 0.455,
0.213, 0.540, 0.456,
0.216, 0.544, 0.457,
0.220, 0.549, 0.458,
0.223, 0.554, 0.459,
0.227, 0.558, 0.460,
0.231, 0.563, 0.461,
0.234, 0.567, 0.462,
0.238, 0.572, 0.463,
0.242, 0.576, 0.463,
0.246, 0.581, 0.464,
0.249, 0.585, 0.465,
0.253, 0.589, 0.466,
0.257, 0.593, 0.466,
0.261, 0.598, 0.467,
0.265, 0.602, 0.468,
0.270, 0.606, 0.469,
0.274, 0.610, 0.469,
0.278, 0.614, 0.470,
0.282, 0.618, 0.471,
0.286, 0.622, 0.471,
0.291, 0.626, 0.472,
0.295, 0.630, 0.473,
0.300, 0.633, 0.473,
0.304, 0.637, 0.474,
0.308, 0.641, 0.475,
0.313, 0.645, 0.475,
0.318, 0.648, 0.476,
0.322, 0.652, 0.477,
0.327, 0.655, 0.478,
0.332, 0.659, 0.478,
0.336, 0.663, 0.479,
0.341, 0.666, 0.480,
0.346, 0.669, 0.480,
0.351, 0.673, 0.481,
0.356, 0.676, 0.482,
0.361, 0.679, 0.483,
0.366, 0.683, 0.484,
0.371, 0.686, 0.485,
0.376, 0.689, 0.485,
0.381, 0.692, 0.486,
0.386, 0.695, 0.487,
0.391, 0.698, 0.488,
0.396, 0.701, 0.489,
0.402, 0.704, 0.490,
0.407, 0.707, 0.491,
0.412, 0.710, 0.492,
0.417, 0.713, 0.493,
0.423, 0.716, 0.495,
0.428, 0.719, 0.496,
0.434, 0.722, 0.497,
0.439, 0.724, 0.498,
0.444, 0.727, 0.499,
0.450, 0.730, 0.501,
0.455, 0.732, 0.502,
0.461, 0.735, 0.504,
0.466, 0.738, 0.505,
0.472, 0.740, 0.506,
0.478, 0.743, 0.508,
0.483, 0.745, 0.509,
0.489, 0.748, 0.511,
0.494, 0.750, 0.513,
0.500, 0.753, 0.514,
0.506, 0.755, 0.516,
0.511, 0.757, 0.518,
0.517, 0.760, 0.520,
0.523, 0.762, 0.522,
0.528, 0.764, 0.523,
0.534, 0.767, 0.525,
0.540, 0.769, 0.527,
0.545, 0.771, 0.529,
0.551, 0.773, 0.532,
0.557, 0.775, 0.534,
0.563, 0.778, 0.536,
0.568, 0.780, 0.538,
0.574, 0.782, 0.540,
0.580, 0.784, 0.543,
0.586, 0.786, 0.545,
0.591, 0.788, 0.548,
0.597, 0.790, 0.550,
0.603, 0.792, 0.553,
0.608, 0.794, 0.555,
0.614, 0.796, 0.558,
0.620, 0.798, 0.561,
0.626, 0.800, 0.563,
0.631, 0.802, 0.566,
0.637, 0.804, 0.569,
0.643, 0.806, 0.572,
0.648, 0.808, 0.575,
0.654, 0.809, 0.578,
0.660, 0.811, 0.581,
0.665, 0.813, 0.584,
0.671, 0.815, 0.587,
0.676, 0.817, 0.591,
0.682, 0.819, 0.594,
0.687, 0.820, 0.597,
0.693, 0.822, 0.601,
0.699, 0.824, 0.604,
0.704, 0.826, 0.608,
0.709, 0.828, 0.611,
0.715, 0.829, 0.615,
0.720, 0.831, 0.618,
0.726, 0.833, 0.622,
0.731, 0.835, 0.626,
0.736, 0.836, 0.630,
0.742, 0.838, 0.633,
0.747, 0.840, 0.637,
0.752, 0.842, 0.641,
0.757, 0.843, 0.645,
0.762, 0.845, 0.649,
0.768, 0.847, 0.653,
0.773, 0.849, 0.657,
0.778, 0.850, 0.662,
0.783, 0.852, 0.666,
0.788, 0.854, 0.670,
0.793, 0.856, 0.674,
0.798, 0.857, 0.679,
0.802, 0.859, 0.683,
0.807, 0.861, 0.688,
0.812, 0.863, 0.692,
0.817, 0.865, 0.697,
0.821, 0.866, 0.701,
0.826, 0.868, 0.706,
0.831, 0.870, 0.710,
0.835, 0.872, 0.715,
0.840, 0.874, 0.720,
0.844, 0.876, 0.724,
0.849, 0.877, 0.729,
0.853, 0.879, 0.734,
0.857, 0.881, 0.739,
0.862, 0.883, 0.744,
0.866, 0.885, 0.749,
0.870, 0.887, 0.754,
0.874, 0.889, 0.759,
0.878, 0.891, 0.764,
0.882, 0.893, 0.769,
0.886, 0.895, 0.774,
0.890, 0.897, 0.779,
0.894, 0.899, 0.784,
0.898, 0.901, 0.789,
0.901, 0.903, 0.794,
0.905, 0.905, 0.799,
0.909, 0.907, 0.804,
0.912, 0.909, 0.810,
0.916, 0.911, 0.815,
0.919, 0.913, 0.820,
0.922, 0.915, 0.825,
0.926, 0.917, 0.831,
0.929, 0.920, 0.836,
0.932, 0.922, 0.841,
0.935, 0.924, 0.847,
0.938, 0.926, 0.852,
0.942, 0.929, 0.857,
0.944, 0.931, 0.863,
0.947, 0.933, 0.868,
0.950, 0.936, 0.873,
0.953, 0.938, 0.879,
0.956, 0.940, 0.884,
0.958, 0.943, 0.889,
0.961, 0.945, 0.895,
0.964, 0.948, 0.900,
0.966, 0.950, 0.905,
0.968, 0.953, 0.911,
0.971, 0.955, 0.916,
0.973, 0.958, 0.921,
0.975, 0.961, 0.927,
0.977, 0.963, 0.932,
0.980, 0.966, 0.937,
0.982, 0.969, 0.943,
0.984, 0.971, 0.948,
0.985, 0.974, 0.953,
0.987, 0.977, 0.959,
0.989, 0.980, 0.964,
0.991, 0.982, 0.969,
0.993, 0.985, 0.974,
0.994, 0.988, 0.979,
0.996, 0.991, 0.985,
0.997, 0.994, 0.990,
0.999, 0.997, 0.995,
1.000, 1.000, 1.000,
};

View File

@ -66,6 +66,9 @@ private:
static const float m_shrimp[m_size]; static const float m_shrimp[m_size];
static const float m_cubehelix[m_size]; static const float m_cubehelix[m_size];
static const float m_cubegamma[m_size]; static const float m_cubegamma[m_size];
static const float m_cubehlx2[m_size];
static const float m_icy[m_size];
static const float m_mint[m_size];
}; };
#endif #endif

View File

@ -12,15 +12,21 @@ set(wdsp_SOURCES
bldr.cpp bldr.cpp
bps.cpp bps.cpp
bpsnba.cpp bpsnba.cpp
bqbp.cpp
bqlp.cpp
calculus.cpp calculus.cpp
cblock.cpp cblock.cpp
cfcomp.cpp cfcomp.cpp
cfir.cpp cfir.cpp
compress.cpp compress.cpp
dbqbp.cpp
dbqlp.cpp
delay.cpp delay.cpp
dsphp.cpp
emnr.cpp emnr.cpp
emph.cpp emph.cpp
eq.cpp emphp.cpp
eqp.cpp
fcurve.cpp fcurve.cpp
fir.cpp fir.cpp
fircore.cpp fircore.cpp
@ -32,15 +38,17 @@ set(wdsp_SOURCES
gain.cpp gain.cpp
gen.cpp gen.cpp
icfir.cpp icfir.cpp
iir.cpp # iir.cpp
iqc.cpp iqc.cpp
lmath.cpp lmath.cpp
meter.cpp meter.cpp
meterlog10.cpp meterlog10.cpp
mpeak.cpp
nbp.cpp nbp.cpp
nob.cpp nob.cpp
osctrl.cpp osctrl.cpp
patchpanel.cpp patchpanel.cpp
phrot.cpp
resample.cpp resample.cpp
resamplef.cpp resamplef.cpp
rmatch.cpp rmatch.cpp
@ -50,8 +58,12 @@ set(wdsp_SOURCES
siphon.cpp siphon.cpp
slew.cpp slew.cpp
snba.cpp snba.cpp
snotch.cpp
speak.cpp
sphp.cpp
ssql.cpp ssql.cpp
TXA.cpp TXA.cpp
unit.cpp
varsamp.cpp varsamp.cpp
wcpAGC.cpp wcpAGC.cpp
) )
@ -67,6 +79,8 @@ set(wdsp_HEADERS
bldr.hpp bldr.hpp
bps.hpp bps.hpp
bpsnba.hpp bpsnba.hpp
bqbp.hpp
bqlp.hpp
bufferprobe.hpp bufferprobe.hpp
calculus.hpp calculus.hpp
cblock.hpp cblock.hpp
@ -74,10 +88,14 @@ set(wdsp_HEADERS
cfir.hpp cfir.hpp
comm.hpp comm.hpp
compress.hpp compress.hpp
dbqbp.hpp
dbqlp.hpp
delay.hpp delay.hpp
dsphp.hpp
emnr.hpp emnr.hpp
emph.hpp emph.hpp
eq.hpp emphp.hpp
eqp.hpp
fcurve.hpp fcurve.hpp
fir.hpp fir.hpp
fircore.hpp fircore.hpp
@ -89,15 +107,17 @@ set(wdsp_HEADERS
gain.hpp gain.hpp
gen.hpp gen.hpp
icfir.hpp icfir.hpp
iir.hpp # iir.hpp
iqc.hpp iqc.hpp
lmath.hpp lmath.hpp
meter.hpp meter.hpp
meterlog10.hpp meterlog10.hpp
mpeak.hpp
nbp.hpp nbp.hpp
nob.hpp nob.hpp
osctrl.hpp osctrl.hpp
patchpanel.hpp patchpanel.hpp
phrot.hpp
resample.hpp resample.hpp
resamplef.hpp resamplef.hpp
rmatch.hpp rmatch.hpp
@ -107,8 +127,12 @@ set(wdsp_HEADERS
siphon.hpp siphon.hpp
slew.hpp slew.hpp
snba.hpp snba.hpp
snotch.hpp
speak.hpp
sphp.hpp
ssql.hpp ssql.hpp
TXA.hpp TXA.hpp
unit.hpp
varsamp.hpp varsamp.hpp
wcpAGC.hpp wcpAGC.hpp
) )

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,8 @@ warren@wpratt.com
#ifndef wdsp_rxa_h #ifndef wdsp_rxa_h
#define wdsp_rxa_h #define wdsp_rxa_h
#include <array>
#include "comm.hpp" #include "comm.hpp"
#include "unit.hpp" #include "unit.hpp"
#include "export.h" #include "export.h"
@ -37,7 +39,6 @@ namespace WDSP {
class METER; class METER;
class SHIFT; class SHIFT;
class RESAMPLE; class RESAMPLE;
class GEN;
class BANDPASS; class BANDPASS;
class BPS; class BPS;
class NOTCHDB; class NOTCHDB;
@ -96,157 +97,101 @@ public:
}; };
int mode; int mode;
double meter[RXA_METERTYPE_LAST]; std::array<double, RXA_METERTYPE_LAST> meter;
struct ANB *anb;
{ NOB *nob;
METER *p; SHIFT *shift;
} smeter, adcmeter, agcmeter; RESAMPLE *rsmpin;
struct METER *adcmeter;
{ NOTCHDB *ndb;
SHIFT *p; NBP *nbp0;
} shift; BPSNBA *bpsnba;
struct SENDER *sender;
{ METER *smeter;
RESAMPLE *p; AMSQ *amsq;
} rsmpin, rsmpout; AMD *amd;
struct FMD *fmd;
{ FMSQ *fmsq;
GEN *p; SNBA *snba;
} gen0; EQP *eqp;
struct ANF *anf;
{ ANR *anr;
BANDPASS *p; EMNR *emnr;
} bp1; WCPAGC *agc;
struct METER *agcmeter;
{ BANDPASS *bp1;
BPS *p; SIPHON *sip1;
} bps1; CBL *cbl;
struct SPEAK *speak;
{ MPEAK *mpeak;
NOTCHDB *p; SSQL *ssql;
} ndb; PANEL *panel;
struct RESAMPLE *rsmpout;
{
NBP *p;
} nbp0;
struct
{
BPSNBA *p;
} bpsnba;
struct
{
SNBA *p;
} snba;
struct
{
SENDER *p;
} sender;
struct
{
AMSQ *p;
} amsq;
struct
{
AMD *p;
} amd;
struct
{
FMD *p;
} fmd;
struct
{
FMSQ *p;
} fmsq;
struct
{
EQP *p;
} eqp;
struct
{
ANF *p;
} anf;
struct
{
ANR *p;
} anr;
struct
{
EMNR *p;
} emnr;
struct
{
WCPAGC *p;
} agc;
struct
{
SPEAK *p;
} speak;
struct
{
MPEAK *p;
} mpeak;
struct
{
PANEL *p;
} panel;
struct
{
SIPHON *p;
} sip1;
struct
{
CBL *p;
} cbl;
struct
{
SSQL *p;
} ssql;
struct
{
ANB *p;
} anb;
struct
{
NOB *p;
} nob;
static RXA* create_rxa ( RXA(
int in_rate, // input samplerate int in_rate, // input samplerate
int out_rate, // output samplerate int out_rate, // output samplerate
int dsp_rate, // sample rate for mainstream dsp processing int dsp_rate, // sample rate for mainstream dsp processing
int dsp_size // number complex samples processed per buffer in mainstream dsp processing int dsp_size // number complex samples processed per buffer in mainstream dsp processing
); );
static void destroy_rxa (RXA *rxa); RXA(const RXA&) = delete;
static void flush_rxa (RXA *rxa); RXA& operator=(const RXA& other) = delete;
static void xrxa (RXA *rxa); virtual ~RXA();
int get_insize() const { return dsp_insize; }
int get_outsize() const { return dsp_outsize; } void flush();
float *get_inbuff() { return inbuff; } void execute();
float *get_outbuff() { return outbuff; } void setInputSamplerate(int _in_rate);
void setOutputSamplerate(int _out_rate);
void setDSPSamplerate(int _dsp_rate);
void setDSPBuffsize(int _dsp_size);
int get_insize() const { return Unit::dsp_insize; }
int get_outsize() const { return Unit::dsp_outsize; }
float *get_inbuff() { return Unit::inbuff; }
float *get_outbuff() { return Unit::outbuff; }
void setSpectrumProbe(BufferProbe *_spectrumProbe); void setSpectrumProbe(BufferProbe *_spectrumProbe);
static void setInputSamplerate (RXA *rxa, int in_rate);
static void setOutputSamplerate (RXA *rxa, int out_rate);
static void setDSPSamplerate (RXA *rxa, int dsp_rate);
static void setDSPBuffsize (RXA *rxa, int dsp_size);
// RXA Properties // RXA Properties
static void SetMode (RXA& rxa, int mode); void setMode (int mode);
static void ResCheck (RXA& rxa); void resCheck ();
static void bp1Check (RXA& rxa, int amd_run, int snba_run, int emnr_run, int anf_run, int anr_run); void bp1Check (int amd_run, int snba_run, int emnr_run, int anf_run, int anr_run);
static void bp1Set (RXA& rxa); void bp1Set ();
static void bpsnbaCheck (RXA& rxa, int mode, int notch_run); void bpsnbaCheck (int mode, int notch_run);
static void bpsnbaSet (RXA& rxa); void bpsnbaSet ();
// NOTCHDB, NBP, SNBA
void updateNBPFiltersLightWeight();
void updateNBPFilters();
int nbpAddNotch(int notch, double fcenter, double fwidth, int active);
int nbpGetNotch(int notch, double* fcenter, double* fwidth, int* active) const;
int nbpDeleteNotch(int notch);
int nbpEditNotch(int notch, double fcenter, double fwidth, int active);
void nbpGetNumNotches(int* nnotches) const;
void nbpSetTuneFrequency(double tunefreq);
void nbpSetShiftFrequency(double shift);
void nbpSetNotchesRun(int run);
void nbpSetWindow(int wintype);
void nbpSetAutoIncrease(int autoincr);
// AMD
void setAMDRun(int run);
// SNBA
void setSNBARun(int run);
// ANF
void setANFRun(int run);
void setANFPosition(int position);
// ANR
void setANRRun(int run);
void setANRPosition(int position);
// EMNR
void setEMNRRun(int run);
void setEMNRPosition(int position);
// WCPAGC
void setAGCThresh(double thresh, double size, double rate);
void getAGCThresh(double *thresh, double size, double rate) const;
// Collectives // Collectives
static void SetPassband (RXA& rxa, float f_low, float f_high); void setPassband(float f_low, float f_high);
static void SetNC (RXA& rxa, int nc); void setNC(int nc);
static void SetMP (RXA& rxa, int mp); void setMP(int mp);
private:
float* inbuff;
float* midbuff;
float* outbuff;
}; };
} // namespace WDSP } // namespace WDSP

File diff suppressed because it is too large Load Diff

View File

@ -36,8 +36,7 @@ warren@wpratt.com
#include "resample.hpp" #include "resample.hpp"
#include "patchpanel.hpp" #include "patchpanel.hpp"
#include "amsq.hpp" #include "amsq.hpp"
#include "eq.hpp" #include "eqp.hpp"
#include "iir.hpp"
#include "cfcomp.hpp" #include "cfcomp.hpp"
#include "compress.hpp" #include "compress.hpp"
#include "bandpass.hpp" #include "bandpass.hpp"
@ -127,127 +126,96 @@ public:
double meter[TXA_METERTYPE_LAST]; double meter[TXA_METERTYPE_LAST];
long upslew; long upslew;
struct METER *micmeter;
{ METER *eqmeter;
METER *p; METER *lvlrmeter;
} micmeter, eqmeter, lvlrmeter, cfcmeter, compmeter, alcmeter, outmeter; METER *cfcmeter;
struct METER *compmeter;
{ METER *alcmeter;
RESAMPLE *p; METER *outmeter;
} rsmpin, rsmpout; RESAMPLE *rsmpin;
struct RESAMPLE *rsmpout;
{ PANEL *panel;
PANEL *p; AMSQ *amsq;
} panel; EQP *eqp;
struct PHROT *phrot;
{ CFCOMP *cfcomp;
AMSQ *p; COMPRESSOR *compressor;
} amsq; BANDPASS *bp0;
struct BANDPASS *bp1;
{ BANDPASS *bp2;
EQP *p; BPS *bps0;
} eqp; BPS *bps1;
struct BPS *bps2;
{ OSCTRL *osctrl;
PHROT *p; WCPAGC *leveler;
} phrot; WCPAGC *alc;
struct AMMOD *ammod;
{ EMPHP *preemph;
CFCOMP *p; FMMOD *fmmod;
} cfcomp; SIPHON *sip1;
struct GEN *gen0;
{ GEN *gen1;
COMPRESSOR *p; USLEW *uslew;
} compressor;
struct
{
BANDPASS *p;
} bp0, bp1, bp2;
struct
{
BPS *p;
} bps0, bps1, bps2;
struct
{
OSCTRL *p;
} osctrl;
struct
{
WCPAGC *p;
} leveler, alc;
struct
{
AMMOD *p;
} ammod;
struct
{
EMPHP *p;
} preemph;
struct
{
FMMOD *p;
} fmmod;
struct
{
SIPHON *p;
} sip1;
struct
{
GEN *p;
} gen0, gen1;
struct
{
USLEW *p;
} uslew;
// struct
// {
// CALCC *p;
// CRITICAL_SECTION cs_update;
// } calcc;
struct struct
{ {
IQC *p0, *p1; IQC *p0, *p1;
// p0 for dsp-synchronized reference, p1 for other // p0 for dsp-synchronized reference, p1 for other
} iqc; } iqc;
struct CFIR *cfir;
{
CFIR *p;
} cfir;
static TXA* create_txa ( TXA(
int in_rate, // input samplerate int in_rate, // input samplerate
int out_rate, // output samplerate int out_rate, // output samplerate
int dsp_rate, // sample rate for mainstream dsp processing int dsp_rate, // sample rate for mainstream dsp processing
int dsp_size // number complex samples processed per buffer in mainstream dsp processing int dsp_size // number complex samples processed per buffer in mainstream dsp processing
); );
static void destroy_txa (TXA *txa); TXA(const TXA&) = delete;
static void flush_txa (TXA *txa); TXA& operator=(const TXA& other) = delete;
static void xtxa (TXA *txa); virtual ~TXA();
int get_insize() const { return dsp_insize; }
int get_outsize() const { return dsp_outsize; } void flush();
float *get_inbuff() { return inbuff; } void execute();
float *get_outbuff() { return outbuff; } void setInputSamplerate(int _in_rate);
static void setInputSamplerate (TXA *txa, int in_rate); void setOutputSamplerate(int _out_rate);
static void setOutputSamplerate (TXA *txa, int out_rate); void setDSPSamplerate(int _dsp_rate);
static void setDSPSamplerate (TXA *txa, int dsp_rate); void setDSPBuffsize(int _dsp_size);
static void setDSPBuffsize (TXA *txa, int dsp_size); int get_insize() const { return Unit::dsp_insize; }
int get_outsize() const { return Unit::dsp_outsize; }
float *get_inbuff() { return Unit::inbuff; }
float *get_outbuff() { return Unit::outbuff; }
// TXA Properties // TXA Properties
static void SetMode (TXA& txa, int mode); void setMode(int mode);
static void SetBandpassFreqs (TXA& txa, float f_low, float f_high); void setBandpassFreqs(float f_low, float f_high);
void setBandpassNC(int nc);
void setBandpassMP(int mp);
// BPS
static void SetBPSRun (TXA& txa, int run);
static void SetBPSFreqs (TXA& txa, double low, double high);
static void SetBPSWindow (TXA& txa, int wintype);
// COMPRESSOR
static void SetCompressorRun (TXA& txa, int run);
// OSCTRL
static void SetosctrlRun (TXA& txa, int run);
// IQC
static void GetiqcValues (TXA& txa, std::vector<double>& cm, std::vector<double>& cc, std::vector<double>& cs);
static void SetiqcValues (TXA& txa, const std::vector<double>& cm, const std::vector<double>& cc, const std::vector<double>& cs);
static void SetiqcSwap (TXA& txa, const std::vector<double>& cm, const std::vector<double>& cc, const std::vector<double>& cs);
static void SetiqcStart (TXA& txa, const std::vector<double>& cm, const std::vector<double>& cc, const std::vector<double>& cs);
static void SetiqcEnd (TXA& txa);
static void GetiqcDogCount (TXA& txa, int* count);
static void SetiqcDogCount (TXA& txa, int count);
// Collectives // Collectives
static void SetNC (TXA& txa, int nc); void setNC(int nc);
static void SetMP (TXA& txa, int mp); void setMP(int mp);
static void SetFMAFFilter (TXA& txa, float low, float high); void setFMAFFilter(float low, float high);
static void SetupBPFilters (TXA& txa); void setupBPFilters();
static int UslewCheck (TXA& txa); int uslewCheck();
private: private:
static void ResCheck (TXA& txa); void resCheck();
float* inbuff;
float* midbuff;
float* outbuff;
}; };
} // namespace WDSP } // namespace WDSP

View File

@ -26,6 +26,7 @@ warren@wpratt.com
*/ */
#include <cmath> #include <cmath>
#include <array>
#include "comm.hpp" #include "comm.hpp"
#include "amd.hpp" #include "amd.hpp"
@ -33,130 +34,125 @@ warren@wpratt.com
#include "emnr.hpp" #include "emnr.hpp"
#include "anr.hpp" #include "anr.hpp"
#include "snba.hpp" #include "snba.hpp"
#include "RXA.hpp"
namespace WDSP { namespace WDSP {
AMD* AMD::create_amd AMD::AMD
( (
int run, int _run,
int buff_size, int _buff_size,
float *in_buff, float *_in_buff,
float *out_buff, float *_out_buff,
int mode, int _mode,
int levelfade, int _levelfade,
int sbmode, int _sbmode,
int sample_rate, int _sample_rate,
double fmin, double _fmin,
double fmax, double _fmax,
double zeta, double _zeta,
double omegaN, double _omegaN,
double tauR, double _tauR,
double tauI double _tauI
) ) :
run(_run),
buff_size(_buff_size),
in_buff(_in_buff),
out_buff(_out_buff),
mode(_mode),
sample_rate((double) _sample_rate),
fmin(_fmin),
fmax(_fmax),
zeta(_zeta),
omegaN(_omegaN),
tauR(_tauR),
tauI(_tauI),
sbmode(_sbmode),
levelfade(_levelfade)
{ {
AMD *a = new AMD(); init();
a->run = run;
a->buff_size = buff_size;
a->in_buff = in_buff;
a->out_buff = out_buff;
a->mode = mode;
a->levelfade = levelfade;
a->sbmode = sbmode;
a->sample_rate = (float)sample_rate;
a->fmin = fmin;
a->fmax = fmax;
a->zeta = zeta;
a->omegaN = omegaN;
a->tauR = tauR;
a->tauI = tauI;
init_amd(a);
return a;
} }
void AMD::destroy_amd(AMD *a) void AMD::init()
{
delete a;
}
void AMD::init_amd(AMD *a)
{ {
//pll //pll
a->omega_min = 2 * M_PI * a->fmin / a->sample_rate; omega_min = 2 * M_PI * fmin / sample_rate;
a->omega_max = 2 * M_PI * a->fmax / a->sample_rate; omega_max = 2 * M_PI * fmax / sample_rate;
a->g1 = 1.0 - std::exp(-2.0 * a->omegaN * a->zeta / a->sample_rate); g1 = 1.0 - std::exp(-2.0 * omegaN * zeta / sample_rate);
a->g2 = -a->g1 + 2.0 * (1 - exp(-a->omegaN * a->zeta / a->sample_rate) * cos(a->omegaN / a->sample_rate * sqrt(1.0 - a->zeta * a->zeta))); g2 = -g1 + 2.0 * (1 - exp(-omegaN * zeta / sample_rate) * cos(omegaN / sample_rate * sqrt(1.0 - zeta * zeta)));
a->phs = 0.0; phs = 0.0;
a->fil_out = 0.0; fil_out = 0.0;
a->omega = 0.0; omega = 0.0;
//fade leveler //fade leveler
a->dc = 0.0; dc = 0.0;
a->dc_insert = 0.0; dc_insert = 0.0;
a->mtauR = exp(-1.0 / (a->sample_rate * a->tauR)); mtauR = exp(-1.0 / (sample_rate * tauR));
a->onem_mtauR = 1.0 - a->mtauR; onem_mtauR = 1.0 - mtauR;
a->mtauI = exp(-1.0 / (a->sample_rate * a->tauI)); mtauI = exp(-1.0 / (sample_rate * tauI));
a->onem_mtauI = 1.0 - a->mtauI; onem_mtauI = 1.0 - mtauI;
//sideband separation //sideband separation
a->c0[0] = -0.328201924180698; c0[0] = -0.328201924180698;
a->c0[1] = -0.744171491539427; c0[1] = -0.744171491539427;
a->c0[2] = -0.923022915444215; c0[2] = -0.923022915444215;
a->c0[3] = -0.978490468768238; c0[3] = -0.978490468768238;
a->c0[4] = -0.994128272402075; c0[4] = -0.994128272402075;
a->c0[5] = -0.998458978159551; c0[5] = -0.998458978159551;
a->c0[6] = -0.999790306259206; c0[6] = -0.999790306259206;
a->c1[0] = -0.0991227952747244; c1[0] = -0.0991227952747244;
a->c1[1] = -0.565619728761389; c1[1] = -0.565619728761389;
a->c1[2] = -0.857467122550052; c1[2] = -0.857467122550052;
a->c1[3] = -0.959123933111275; c1[3] = -0.959123933111275;
a->c1[4] = -0.988739372718090; c1[4] = -0.988739372718090;
a->c1[5] = -0.996959189310611; c1[5] = -0.996959189310611;
a->c1[6] = -0.999282492800792; c1[6] = -0.999282492800792;
} }
void AMD::flush_amd (AMD *a) void AMD::flush()
{ {
a->dc = 0.0; dc = 0.0;
a->dc_insert = 0.0; dc_insert = 0.0;
} }
void AMD::xamd (AMD *a) void AMD::execute()
{ {
int i;
double audio; double audio;
double vco[2]; std::array<double, 2> vco;
double corr[2]; std::array<double, 2> corr;
double det; double det;
double del_out; double del_out;
double ai, bi, aq, bq; double ai;
double ai_ps, bi_ps, aq_ps, bq_ps; double bi;
int j, k; double aq;
double bq;
double ai_ps;
double bi_ps;
double aq_ps;
double bq_ps;
if (a->run) if (run)
{ {
switch (a->mode) switch (mode)
{ {
case 0: //AM Demodulator case 0: //AM Demodulator
{ {
for (i = 0; i < a->buff_size; i++) for (int i = 0; i < buff_size; i++)
{ {
double xr = a->in_buff[2 * i + 0]; double xr = in_buff[2 * i + 0];
double xi = a->in_buff[2 * i + 1]; double xi = in_buff[2 * i + 1];
audio = sqrt(xr*xr + xi*xi); audio = sqrt(xr*xr + xi*xi);
if (a->levelfade) if (levelfade)
{ {
a->dc = a->mtauR * a->dc + a->onem_mtauR * audio; dc = mtauR * dc + onem_mtauR * audio;
a->dc_insert = a->mtauI * a->dc_insert + a->onem_mtauI * audio; dc_insert = mtauI * dc_insert + onem_mtauI * audio;
audio += a->dc_insert - a->dc; audio += dc_insert - dc;
} }
a->out_buff[2 * i + 0] = audio; out_buff[2 * i + 0] = (float) audio;
a->out_buff[2 * i + 1] = audio; out_buff[2 * i + 1] = (float) audio;
} }
break; break;
@ -164,52 +160,52 @@ void AMD::xamd (AMD *a)
case 1: //Synchronous AM Demodulator with Sideband Separation case 1: //Synchronous AM Demodulator with Sideband Separation
{ {
for (i = 0; i < a->buff_size; i++) for (int i = 0; i < buff_size; i++)
{ {
vco[0] = cos(a->phs); vco[0] = cos(phs);
vco[1] = sin(a->phs); vco[1] = sin(phs);
ai = a->in_buff[2 * i + 0] * vco[0]; ai = in_buff[2 * i + 0] * vco[0];
bi = a->in_buff[2 * i + 0] * vco[1]; bi = in_buff[2 * i + 0] * vco[1];
aq = a->in_buff[2 * i + 1] * vco[0]; aq = in_buff[2 * i + 1] * vco[0];
bq = a->in_buff[2 * i + 1] * vco[1]; bq = in_buff[2 * i + 1] * vco[1];
if (a->sbmode != 0) if (sbmode != 0)
{ {
a->a[0] = a->dsI; a[0] = dsI;
a->b[0] = bi; b[0] = bi;
a->c[0] = a->dsQ; c[0] = dsQ;
a->d[0] = aq; d[0] = aq;
a->dsI = ai; dsI = ai;
a->dsQ = bq; dsQ = bq;
for (j = 0; j < STAGES; j++) for (int j = 0; j < STAGES; j++)
{ {
k = 3 * j; int k = 3 * j;
a->a[k + 3] = a->c0[j] * (a->a[k] - a->a[k + 5]) + a->a[k + 2]; a[k + 3] = c0[j] * (a[k] - a[k + 5]) + a[k + 2];
a->b[k + 3] = a->c1[j] * (a->b[k] - a->b[k + 5]) + a->b[k + 2]; b[k + 3] = c1[j] * (b[k] - b[k + 5]) + b[k + 2];
a->c[k + 3] = a->c0[j] * (a->c[k] - a->c[k + 5]) + a->c[k + 2]; c[k + 3] = c0[j] * (c[k] - c[k + 5]) + c[k + 2];
a->d[k + 3] = a->c1[j] * (a->d[k] - a->d[k + 5]) + a->d[k + 2]; d[k + 3] = c1[j] * (d[k] - d[k + 5]) + d[k + 2];
} }
ai_ps = a->a[OUT_IDX]; ai_ps = a[OUT_IDX];
bi_ps = a->b[OUT_IDX]; bi_ps = b[OUT_IDX];
bq_ps = a->c[OUT_IDX]; bq_ps = c[OUT_IDX];
aq_ps = a->d[OUT_IDX]; aq_ps = d[OUT_IDX];
for (j = OUT_IDX + 2; j > 0; j--) for (int j = OUT_IDX + 2; j > 0; j--)
{ {
a->a[j] = a->a[j - 1]; a[j] = a[j - 1];
a->b[j] = a->b[j - 1]; b[j] = b[j - 1];
a->c[j] = a->c[j - 1]; c[j] = c[j - 1];
a->d[j] = a->d[j - 1]; d[j] = d[j - 1];
} }
} }
corr[0] = +ai + bq; corr[0] = +ai + bq;
corr[1] = -bi + aq; corr[1] = -bi + aq;
switch(a->sbmode) switch(sbmode)
{ {
case 0: //both sidebands case 0: //both sidebands
{ {
@ -226,102 +222,86 @@ void AMD::xamd (AMD *a)
audio = (ai_ps + bi_ps) - (aq_ps - bq_ps); audio = (ai_ps + bi_ps) - (aq_ps - bq_ps);
break; break;
} }
default:
break;
} }
if (a->levelfade) if (levelfade)
{ {
a->dc = a->mtauR * a->dc + a->onem_mtauR * audio; dc = mtauR * dc + onem_mtauR * audio;
a->dc_insert = a->mtauI * a->dc_insert + a->onem_mtauI * corr[0]; dc_insert = mtauI * dc_insert + onem_mtauI * corr[0];
audio += a->dc_insert - a->dc; audio += dc_insert - dc;
} }
a->out_buff[2 * i + 0] = audio; out_buff[2 * i + 0] = (float) audio;
a->out_buff[2 * i + 1] = audio; out_buff[2 * i + 1] = (float) audio;
if ((corr[0] == 0.0) && (corr[1] == 0.0)) if ((corr[0] == 0.0) && (corr[1] == 0.0))
corr[0] = 1.0; corr[0] = 1.0;
det = atan2(corr[1], corr[0]); det = atan2(corr[1], corr[0]);
del_out = a->fil_out; del_out = fil_out;
a->omega += a->g2 * det; omega += g2 * det;
if (a->omega < a->omega_min) if (omega < omega_min)
a->omega = a->omega_min; omega = omega_min;
if (a->omega > a->omega_max) if (omega > omega_max)
a->omega = a->omega_max; omega = omega_max;
a->fil_out = a->g1 * det + a->omega; fil_out = g1 * det + omega;
a->phs += del_out; phs += del_out;
while (a->phs >= 2 * M_PI) while (phs >= 2 * M_PI)
a->phs -= 2 * M_PI; phs -= 2 * M_PI;
while (a->phs < 0.0) while (phs < 0.0)
a->phs += 2 * M_PI; phs += 2 * M_PI;
} }
break; break;
} }
default:
break;
} }
} }
else if (a->in_buff != a->out_buff) else if (in_buff != out_buff)
{ {
std::copy (a->in_buff, a->in_buff + a->buff_size * 2, a->out_buff); std::copy (in_buff, in_buff + buff_size * 2, out_buff);
} }
} }
void AMD::setBuffers_amd (AMD *a, float* in, float* out) void AMD::setBuffers(float* in, float* out)
{ {
a->in_buff = in; in_buff = in;
a->out_buff = out; out_buff = out;
} }
void AMD::setSamplerate_amd (AMD *a, int rate) void AMD::setSamplerate(int rate)
{ {
a->sample_rate = rate; sample_rate = rate;
init_amd(a); init();
} }
void AMD::setSize_amd (AMD *a, int size) void AMD::setSize(int size)
{ {
a->buff_size = size; buff_size = size;
} }
/******************************************************************************************************** /********************************************************************************************************
* * * *
* RXA Properties * * Public Properties *
* * * *
********************************************************************************************************/ ********************************************************************************************************/
void AMD::SetAMDRun(RXA& rxa, int run) void AMD::setSBMode(int _sbmode)
{ {
AMD *a = rxa.amd.p; sbmode = _sbmode;
if (a->run != run)
{
RXA::bp1Check (
rxa,
run,
rxa.snba.p->run,
rxa.emnr.p->run,
rxa.anf.p->run,
rxa.anr.p->run
);
a->run = run;
RXA::bp1Set (rxa);
}
} }
void AMD::SetAMDSBMode(RXA& rxa, int sbmode) void AMD::setFadeLevel(int _levelfade)
{ {
rxa.amd.p->sbmode = sbmode; levelfade = _levelfade;
}
void AMD::SetAMDFadeLevel(RXA& rxa, int levelfade)
{
rxa.amd.p->levelfade = levelfade;
} }
} // namesoace WDSP } // namesoace WDSP

View File

@ -28,21 +28,12 @@ warren@wpratt.com
#ifndef wdsp_amd_hpp #ifndef wdsp_amd_hpp
#define wdsp_amd_hpp #define wdsp_amd_hpp
// ff defines for sbdemod #include <array>
#ifndef STAGES
#define STAGES 7
#endif
#ifndef OUT_IDX
#define OUT_IDX (3 * STAGES)
#endif
#include "export.h" #include "export.h"
namespace WDSP { namespace WDSP {
class RXA;
class WDSP_API AMD { class WDSP_API AMD {
public: public:
int run; int run;
@ -61,26 +52,29 @@ public:
double phs; // pll - phase accumulator double phs; // pll - phase accumulator
double omega; // pll - locked pll frequency double omega; // pll - locked pll frequency
double fil_out; // pll - filter output double fil_out; // pll - filter output
double g1, g2; // pll - filter gain parameters double g1; // pll - filter gain parameters
double g2; // pll - filter gain parameters
double tauR; // carrier removal time constant double tauR; // carrier removal time constant
double tauI; // carrier insertion time constant double tauI; // carrier insertion time constant
double mtauR; // carrier removal multiplier double mtauR; // carrier removal multiplier
double onem_mtauR; // 1.0 - carrier_removal_multiplier double onem_mtauR; // 1.0 - carrier_removal_multiplier
double mtauI; // carrier insertion multiplier double mtauI; // carrier insertion multiplier
double onem_mtauI; // 1.0 - carrier_insertion_multiplier double onem_mtauI; // 1.0 - carrier_insertion_multiplier
double a[3 * STAGES + 3]; // Filter a variables static const int STAGES = 7;
double b[3 * STAGES + 3]; // Filter b variables static const int OUT_IDX = 3 * STAGES;
double c[3 * STAGES + 3]; // Filter c variables std::array<double, 3*STAGES + 3> a; // Filter a variables
double d[3 * STAGES + 3]; // Filter d variables std::array<double, 3*STAGES + 3> b; // Filter b variables
double c0[STAGES]; // Filter coefficients - path 0 std::array<double, 3*STAGES + 3> c; // Filter c variables
double c1[STAGES]; // Filter coefficients - path 1 std::array<double, 3*STAGES + 3> d; // Filter d variables
std::array<double, STAGES> c0; // Filter coefficients - path 0
std::array<double, STAGES> c1; // Filter coefficients - path 1
double dsI; // delayed sample, I path double dsI; // delayed sample, I path
double dsQ; // delayed sample, Q path double dsQ; // delayed sample, Q path
double dc_insert; // dc component to insert in output double dc_insert; // dc component to insert in output
int sbmode; // sideband mode int sbmode; // sideband mode
int levelfade; // Fade Leveler switch int levelfade; // Fade Leveler switch
static AMD* create_amd AMD
( (
int run, int run,
int buff_size, int buff_size,
@ -97,18 +91,19 @@ public:
double tauR, double tauR,
double tauI double tauI
); );
AMD(const AMD&) = delete;
AMD& operator=(const AMD& other) = delete;
~AMD() = default;
static void init_amd (AMD *a); void init();
static void destroy_amd (AMD *a); void flush();
static void flush_amd (AMD *a); void execute();
static void xamd (AMD *a); void setBuffers(float* in, float* out);
static void setBuffers_amd (AMD *a, float* in, float* out); void setSamplerate(int rate);
static void setSamplerate_amd (AMD *a, int rate); void setSize(int size);
static void setSize_amd (AMD *a, int size); // Public Properties
// RXA Properties void setSBMode(int sbmode);
static void SetAMDRun(RXA& rxa, int run); void setFadeLevel(int levelfade);
static void SetAMDSBMode(RXA& rxa, int sbmode);
static void SetAMDFadeLevel(RXA& rxa, int levelfade);
}; };
} // namespace WDSP } // namespace WDSP

Some files were not shown because too many files have changed in this diff Show More