mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 09:18:54 -05:00
Normalise pulse shaping. Enable RTTY Mod in Demod analyser.
This commit is contained in:
parent
ad2bb38bfc
commit
0f0c1e108b
1
.gitignore
vendored
1
.gitignore
vendored
@ -43,3 +43,4 @@ obj-x86_64-linux-gnu/*
|
|||||||
|
|
||||||
/rescuesdriq/vendor/
|
/rescuesdriq/vendor/
|
||||||
/rescuesdriq/Godeps/
|
/rescuesdriq/Godeps/
|
||||||
|
/.vs
|
||||||
|
@ -1,56 +1,94 @@
|
|||||||
{
|
{
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"configurePresets": [
|
"configurePresets": [
|
||||||
{
|
{
|
||||||
"name": "default",
|
"name": "default",
|
||||||
"binaryDir": "build-default",
|
"binaryDir": "build-default",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"DEBUG_OUTPUT": "ON",
|
"DEBUG_OUTPUT": "ON",
|
||||||
"AIRSPYHF_DIR": "/opt/install/libairspyhf",
|
"AIRSPYHF_DIR": "/opt/install/libairspyhf",
|
||||||
"AIRSPY_DIR": "/opt/install/libairspy",
|
"AIRSPY_DIR": "/opt/install/libairspy",
|
||||||
"APT_DIR": "/opt/install/aptdec",
|
"APT_DIR": "/opt/install/aptdec",
|
||||||
"BLADERF_DIR": "/opt/install/libbladeRF",
|
"BLADERF_DIR": "/opt/install/libbladeRF",
|
||||||
"CM256CC_DIR": "/opt/install/cm256cc",
|
"CM256CC_DIR": "/opt/install/cm256cc",
|
||||||
"CODEC2_DIR": "/opt/install/codec2",
|
"CODEC2_DIR": "/opt/install/codec2",
|
||||||
"DAB_DIR": "/opt/install/libdab",
|
"DAB_DIR": "/opt/install/libdab",
|
||||||
"DSDCC_DIR": "/opt/install/dsdcc",
|
"DSDCC_DIR": "/opt/install/dsdcc",
|
||||||
"HACKRF_DIR": "/opt/install/libhackrf",
|
"HACKRF_DIR": "/opt/install/libhackrf",
|
||||||
"HAMLIB_DIR": "/opt/build/hamlib-prefix",
|
"HAMLIB_DIR": "/opt/build/hamlib-prefix",
|
||||||
"IIO_DIR": "/opt/install/libiio",
|
"IIO_DIR": "/opt/install/libiio",
|
||||||
"LIBSIGMF_DIR": "/opt/install/libsigmf",
|
"LIBSIGMF_DIR": "/opt/install/libsigmf",
|
||||||
"LIMESUITE_DIR": "/opt/install/LimeSuite",
|
"LIMESUITE_DIR": "/opt/install/LimeSuite",
|
||||||
"MBE_DIR": "/opt/install/mbelib",
|
"MBE_DIR": "/opt/install/mbelib",
|
||||||
"MIRISDR_DIR": "/opt/install/libmirisdr",
|
"MIRISDR_DIR": "/opt/install/libmirisdr",
|
||||||
"PERSEUS_DIR": "/opt/install/libperseus",
|
"PERSEUS_DIR": "/opt/install/libperseus",
|
||||||
"RTLSDR_DIR": "/opt/install/librtlsdr",
|
"RTLSDR_DIR": "/opt/install/librtlsdr",
|
||||||
"SERIALDV_DIR": "/opt/install/serialdv",
|
"SERIALDV_DIR": "/opt/install/serialdv",
|
||||||
"SGP4_DIR": "/opt/install/sgp4",
|
"SGP4_DIR": "/opt/install/sgp4",
|
||||||
"SOAPYSDR_DIR": "/opt/install/SoapySDR",
|
"SOAPYSDR_DIR": "/opt/install/SoapySDR",
|
||||||
"UHD_DIR": "/opt/install/uhd",
|
"UHD_DIR": "/opt/install/uhd",
|
||||||
"XTRX_DIR": "/opt/install/xtrx-images",
|
"XTRX_DIR": "/opt/install/xtrx-images",
|
||||||
"CMAKE_INSTALL_PREFIX": "/opt/install/sdrangel"
|
"CMAKE_INSTALL_PREFIX": "/opt/install/sdrangel"
|
||||||
},
|
|
||||||
"warnings": {
|
|
||||||
"dev": false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
"warnings": {
|
||||||
"name": "default-qt6",
|
"dev": false
|
||||||
"inherits": "default",
|
},
|
||||||
"binaryDir": "build-qt6",
|
"vendor": {
|
||||||
"cacheVariables": {
|
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
||||||
"ENABLE_QT6": "ON"
|
"hostOS": [ "Linux" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Don't inherit from "default", as we don't want UHD_DIR etc set
|
||||||
|
"name": "default-windows",
|
||||||
|
"binaryDir": "c:/users/jon/source/repos/sdrangel/build",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
|
||||||
|
"DEBUG_OUTPUT": "ON",
|
||||||
|
"RX_SAMPLE_24BIT": "ON",
|
||||||
|
"DARCH_OPT": "SSE4_1",
|
||||||
|
"HIDE_CONSOLE": "OFF",
|
||||||
|
"ENABLE_AIRSPY": "ON",
|
||||||
|
"ENABLE_BLADERF": "OFF",
|
||||||
|
"ENABLE_HACKRF": "OFF",
|
||||||
|
"ENABLE_IIO": "OFF",
|
||||||
|
"ENABLE_MIRISDR": "OFF",
|
||||||
|
"ENABLE_PERSEUS": "OFF",
|
||||||
|
"ENABLE_XTRX": "OFF",
|
||||||
|
"BUILD_SERVER": "OFF",
|
||||||
|
"CMAKE_PREFIX_PATH": "C:/Qt/5.15.2/msvc2019_64;C:/Applications/boost_1_81_0"
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"dev": false
|
||||||
|
},
|
||||||
|
"vendor": {
|
||||||
|
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
||||||
|
"hostOS": [ "Windows" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "default-qt6",
|
||||||
|
"inherits": "default",
|
||||||
|
"binaryDir": "build-qt6",
|
||||||
|
"cacheVariables": {
|
||||||
|
"ENABLE_QT6": "ON"
|
||||||
|
}
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"buildPresets": [
|
"buildPresets": [
|
||||||
{
|
{
|
||||||
"name": "default",
|
"name": "default",
|
||||||
"configurePreset": "default"
|
"configurePreset": "default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "default-qt6",
|
"name": "default-windows",
|
||||||
"configurePreset": "default-qt6"
|
"configurePreset": "default-windows"
|
||||||
}
|
},
|
||||||
]
|
{
|
||||||
|
"name": "default-qt6",
|
||||||
|
"configurePreset": "default-qt6"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
This plugin can be used to transmit RTTY encoded text.
|
This plugin can be used to modulate RTTY (Radioteletype) encoded text.
|
||||||
|
RTTY uses BFSK (Binary Frequency Shift Keying), where transmission of data alternates between two frequencies,
|
||||||
|
the mark frequency and the space frequency. The RTTY Modulator should be centered in between these frequencies.
|
||||||
|
The baud rate, frequency shift (difference between mark and space frequencies), filter bandwidth and baudot character set are configurable.
|
||||||
|
|
||||||
<h2>Interface</h2>
|
<h2>Interface</h2>
|
||||||
|
|
||||||
@ -64,7 +67,14 @@ UDP port number to receive text to be transmitted on.
|
|||||||
|
|
||||||
<h3>13: Baudot Character Set</h3>
|
<h3>13: Baudot Character Set</h3>
|
||||||
|
|
||||||
Specifies the Baudot character set used to encode the text to transmit.
|
Specifies the Baudot character set used to encode the text to transmit. The following character sets are supported:
|
||||||
|
|
||||||
|
* ITA 2
|
||||||
|
* UK
|
||||||
|
* European
|
||||||
|
* US
|
||||||
|
* Russian
|
||||||
|
* Murray
|
||||||
|
|
||||||
<h3>14: Bit Ordering</h3>
|
<h3>14: Bit Ordering</h3>
|
||||||
|
|
||||||
@ -90,11 +100,20 @@ Press to clear the transmitted text.
|
|||||||
|
|
||||||
Enter text to transmit. Pressing return will transmit the text and clear this field. Press the arrow to display and select a list of pre-defined text or previously transmitted text to enter in to the field.
|
Enter text to transmit. Pressing return will transmit the text and clear this field. Press the arrow to display and select a list of pre-defined text or previously transmitted text to enter in to the field.
|
||||||
|
|
||||||
|
The list of pre-defined text can be customised via the Transmit Settings dialog (20).
|
||||||
|
|
||||||
<h3>20: TX</h3>
|
<h3>20: TX</h3>
|
||||||
|
|
||||||
Press to transmits the current text. The text field will not be cleared.
|
Press to transmit the current text. The text field will not be cleared.
|
||||||
|
|
||||||
Right click to open a dialog to adjust additional transmitter settings.
|
Right click to open a dialog to adjust additional Transmit Settings, including the list of pre-defined text.
|
||||||
|
|
||||||
|
Predefined text supports the following variable substitutions:
|
||||||
|
|
||||||
|
* ${callsign} - Gets replaced with the station name from Preferences > My Position
|
||||||
|
* ${location} = Gets replaced with the Maidenhead locator for the position specified under Preferences > My Position
|
||||||
|
|
||||||
|
The substitutions are applied when the Transmit Settings dialog is closed.
|
||||||
|
|
||||||
<h2>API</h2>
|
<h2>API</h2>
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ RttyModSource::RttyModSource() :
|
|||||||
{
|
{
|
||||||
m_bits.append(0);
|
m_bits.append(0);
|
||||||
m_lowpass.create(301, m_channelSampleRate, 400.0 / 2.0);
|
m_lowpass.create(301, m_channelSampleRate, 400.0 / 2.0);
|
||||||
m_pulseShape.create(0.5, 6, m_channelSampleRate/45.45);
|
m_pulseShape.create(0.5, 6, m_channelSampleRate / 45.45, true);
|
||||||
|
|
||||||
m_demodBuffer.resize(1<<12);
|
m_demodBuffer.resize(1<<12);
|
||||||
m_demodBufferFill = 0;
|
m_demodBufferFill = 0;
|
||||||
@ -121,7 +121,7 @@ void RttyModSource::sampleToSpectrum(Complex sample)
|
|||||||
|
|
||||||
void RttyModSource::modulateSample()
|
void RttyModSource::modulateSample()
|
||||||
{
|
{
|
||||||
Real audioMod;
|
Real mod;
|
||||||
|
|
||||||
if (m_sampleIdx == 0)
|
if (m_sampleIdx == 0)
|
||||||
{
|
{
|
||||||
@ -154,18 +154,18 @@ void RttyModSource::modulateSample()
|
|||||||
if (m_settings.m_pulseShaping)
|
if (m_settings.m_pulseShaping)
|
||||||
{
|
{
|
||||||
if (m_sampleIdx == 1) {
|
if (m_sampleIdx == 1) {
|
||||||
audioMod = m_pulseShape.filter(m_bit ? 1.0f : -1.0f);
|
mod = m_pulseShape.filter(m_bit ? 1.0f : -1.0f);
|
||||||
} else {
|
} else {
|
||||||
audioMod = m_pulseShape.filter(0.0f);
|
mod = m_pulseShape.filter(0.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
audioMod = m_bit ? 1.0f : -1.0f;
|
mod = m_bit ? 1.0f : -1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FM
|
// FM
|
||||||
m_fmPhase += m_phaseSensitivity * audioMod * (m_settings.m_spaceHigh ? -1.0f : 1.0f);
|
m_fmPhase += m_phaseSensitivity * mod * (m_settings.m_spaceHigh ? -1.0f : 1.0f);
|
||||||
// Keep phase in range -pi,pi
|
// Keep phase in range -pi,pi
|
||||||
if (m_fmPhase > M_PI) {
|
if (m_fmPhase > M_PI) {
|
||||||
m_fmPhase -= 2.0f * M_PI;
|
m_fmPhase -= 2.0f * M_PI;
|
||||||
@ -194,7 +194,8 @@ void RttyModSource::modulateSample()
|
|||||||
Real s = std::real(m_modSample);
|
Real s = std::real(m_modSample);
|
||||||
calculateLevel(s);
|
calculateLevel(s);
|
||||||
|
|
||||||
m_demodBuffer[m_demodBufferFill] = audioMod * std::numeric_limits<int16_t>::max();
|
// Send to demod analyser
|
||||||
|
m_demodBuffer[m_demodBufferFill] = mod * std::numeric_limits<int16_t>::max();
|
||||||
++m_demodBufferFill;
|
++m_demodBufferFill;
|
||||||
|
|
||||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||||
@ -258,7 +259,7 @@ void RttyModSource::applySettings(const RttyModSettings& settings, bool force)
|
|||||||
<< " symbolSpan: " << settings.m_symbolSpan
|
<< " symbolSpan: " << settings.m_symbolSpan
|
||||||
<< " channelSampleRate:" << m_channelSampleRate
|
<< " channelSampleRate:" << m_channelSampleRate
|
||||||
<< " baud:" << settings.m_baud;
|
<< " baud:" << settings.m_baud;
|
||||||
m_pulseShape.create(settings.m_beta, m_settings.m_symbolSpan, m_channelSampleRate/settings.m_baud);
|
m_pulseShape.create(settings.m_beta, settings.m_symbolSpan, m_channelSampleRate/settings.m_baud, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((settings.m_characterSet != m_settings.m_characterSet) || force) {
|
if ((settings.m_characterSet != m_settings.m_characterSet) || force) {
|
||||||
@ -302,7 +303,7 @@ void RttyModSource::applyChannelSettings(int channelSampleRate, int channelFrequ
|
|||||||
<< " symbolSpan: " << m_settings.m_symbolSpan
|
<< " symbolSpan: " << m_settings.m_symbolSpan
|
||||||
<< " channelSampleRate:" << m_channelSampleRate
|
<< " channelSampleRate:" << m_channelSampleRate
|
||||||
<< " baud:" << m_settings.m_baud;
|
<< " baud:" << m_settings.m_baud;
|
||||||
m_pulseShape.create(m_settings.m_beta, m_settings.m_symbolSpan, channelSampleRate/m_settings.m_baud);
|
m_pulseShape.create(m_settings.m_beta, m_settings.m_symbolSpan, channelSampleRate/m_settings.m_baud, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_channelSampleRate != channelSampleRate) || force)
|
if ((m_channelSampleRate != channelSampleRate) || force)
|
||||||
|
@ -38,6 +38,7 @@ const QStringList DemodAnalyzerSettings::m_channelTypes = {
|
|||||||
QStringLiteral("PacketDemod"),
|
QStringLiteral("PacketDemod"),
|
||||||
QStringLiteral("PacketMod"),
|
QStringLiteral("PacketMod"),
|
||||||
QStringLiteral("RadiosondeDemod"),
|
QStringLiteral("RadiosondeDemod"),
|
||||||
|
QStringLiteral("RTTYMod"),
|
||||||
QStringLiteral("SSBDemod"),
|
QStringLiteral("SSBDemod"),
|
||||||
QStringLiteral("SSBMod"),
|
QStringLiteral("SSBMod"),
|
||||||
QStringLiteral("WFMDemod"),
|
QStringLiteral("WFMDemod"),
|
||||||
@ -60,6 +61,7 @@ const QStringList DemodAnalyzerSettings::m_channelURIs = {
|
|||||||
QStringLiteral("sdrangel.channel.packetdemod"),
|
QStringLiteral("sdrangel.channel.packetdemod"),
|
||||||
QStringLiteral("sdrangel.channeltx.modpacket"),
|
QStringLiteral("sdrangel.channeltx.modpacket"),
|
||||||
QStringLiteral("sdrangel.channel.radiosondedemod"),
|
QStringLiteral("sdrangel.channel.radiosondedemod"),
|
||||||
|
QStringLiteral("sdrangel.channeltx.modrtty"),
|
||||||
QStringLiteral("sdrangel.channel.ssbdemod"),
|
QStringLiteral("sdrangel.channel.ssbdemod"),
|
||||||
QStringLiteral("sdrangel.channeltx.modssb"),
|
QStringLiteral("sdrangel.channeltx.modssb"),
|
||||||
QStringLiteral("sdrangel.channel.wfmdemod"),
|
QStringLiteral("sdrangel.channel.wfmdemod"),
|
||||||
|
Loading…
Reference in New Issue
Block a user