1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-24 03:02:29 -04:00

Server: added WFM demod plugin

This commit is contained in:
f4exb 2018-05-29 11:14:24 +02:00
parent c31a34ea41
commit 1770192116
5 changed files with 82 additions and 31 deletions

View File

@ -495,8 +495,7 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
if ((settings.m_squelch != m_settings.m_squelch) || force) if ((settings.m_squelch != m_settings.m_squelch) || force)
{ {
qDebug() << "BFMDemod::handleMessage: set m_squelchLevel"; qDebug() << "BFMDemod::handleMessage: set m_squelchLevel";
m_squelchLevel = std::pow(10.0, settings.m_squelch / 20.0); m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0);
m_squelchLevel *= m_squelchLevel;
} }
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)

View File

@ -107,41 +107,41 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
for (int i = 0 ; i < rf_out; i++) for (int i = 0 ; i < rf_out; i++)
{ {
demod = m_phaseDiscri.phaseDiscriminatorDelta(rf[i], msq, fmDev); msq = rf[i].real()*rf[i].real() + rf[i].imag()*rf[i].imag();
Real magsq = msq / (SDR_RX_SCALED*SDR_RX_SCALED); Real magsq = msq / (SDR_RX_SCALED*SDR_RX_SCALED);
m_movingAverage(magsq);
m_magsqSum += magsq; m_magsqSum += magsq;
m_movingAverage(magsq);
if (magsq > m_magsqPeak) if (magsq > m_magsqPeak) {
{
m_magsqPeak = magsq; m_magsqPeak = magsq;
} }
m_magsqCount++; m_magsqCount++;
if((Real) m_movingAverage >= m_squelchLevel) if (magsq >= m_squelchLevel)
m_squelchState = m_settings.m_rfBandwidth / 20; // decay rate
if (m_squelchState > 0)
{ {
m_squelchState--; if (m_squelchState < m_settings.m_rfBandwidth / 10) { // twice attack and decay rate
m_squelchOpen = true; m_squelchState++;
}
} }
else else
{ {
demod = 0; if (m_squelchState > 0) {
m_squelchOpen = false; m_squelchState--;
}
} }
if (m_settings.m_audioMute) m_squelchOpen = (m_squelchState > (m_settings.m_rfBandwidth / 20));
{
if (m_squelchOpen && !m_settings.m_audioMute) { // squelch open and not mute
demod = m_phaseDiscri.phaseDiscriminatorDelta(rf[i], msq, fmDev);
} else {
demod = 0; demod = 0;
} }
Complex e(demod, 0); Complex e(demod, 0);
if(m_interpolator.decimate(&m_interpolatorDistanceRemain, e, &ci)) if (m_interpolator.decimate(&m_interpolatorDistanceRemain, e, &ci))
{ {
qint16 sample = (qint16)(ci.real() * 3276.8f * m_settings.m_volume); qint16 sample = (qint16)(ci.real() * 3276.8f * m_settings.m_volume);
m_sampleBuffer.push_back(Sample(sample, sample)); m_sampleBuffer.push_back(Sample(sample, sample));
@ -154,8 +154,7 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
{ {
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1); uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1);
if(res != m_audioBufferFill) if (res != m_audioBufferFill) {
{
qDebug("WFMDemod::feed: %u/%u audio samples written", res, m_audioBufferFill); qDebug("WFMDemod::feed: %u/%u audio samples written", res, m_audioBufferFill);
} }
@ -167,12 +166,11 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
} }
} }
if(m_audioBufferFill > 0) if (m_audioBufferFill > 0)
{ {
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1); uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1);
if(res != m_audioBufferFill) if (res != m_audioBufferFill) {
{
qDebug("WFMDemod::feed: %u/%u tail samples written", res, m_audioBufferFill); qDebug("WFMDemod::feed: %u/%u tail samples written", res, m_audioBufferFill);
} }
@ -339,8 +337,7 @@ void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force)
if ((settings.m_squelch != m_settings.m_squelch) || force) if ((settings.m_squelch != m_settings.m_squelch) || force)
{ {
qDebug() << "WFMDemod::applySettings: set m_squelchLevel"; qDebug() << "WFMDemod::applySettings: set m_squelchLevel";
m_squelchLevel = pow(10.0, settings.m_squelch / 20.0); m_squelchLevel = pow(10.0, settings.m_squelch / 10.0);
m_squelchLevel *= m_squelchLevel;
} }
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)

View File

@ -3,7 +3,9 @@
#include <QtPlugin> #include <QtPlugin>
#include "plugin/pluginapi.h" #include "plugin/pluginapi.h"
#ifndef SERVER_MODE
#include "wfmdemodgui.h" #include "wfmdemodgui.h"
#endif
#include "wfmdemod.h" #include "wfmdemod.h"
const PluginDescriptor WFMPlugin::m_pluginDescriptor = { const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
@ -34,10 +36,19 @@ void WFMPlugin::initPlugin(PluginAPI* pluginAPI)
m_pluginAPI->registerRxChannel(WFMDemod::m_channelIdURI, WFMDemod::m_channelId, this); m_pluginAPI->registerRxChannel(WFMDemod::m_channelIdURI, WFMDemod::m_channelId, this);
} }
#ifdef SERVER_MODE
PluginInstanceGUI* WFMPlugin::createRxChannelGUI(
DeviceUISet *deviceUISet __attribute__((unused)),
BasebandSampleSink *rxChannel __attribute__((unused)))
{
return 0;
}
#else
PluginInstanceGUI* WFMPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) PluginInstanceGUI* WFMPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
{ {
return WFMDemodGUI::create(m_pluginAPI, deviceUISet, rxChannel); return WFMDemodGUI::create(m_pluginAPI, deviceUISet, rxChannel);
} }
#endif
BasebandSampleSink* WFMPlugin::createRxChannelBS(DeviceSourceAPI *deviceAPI) BasebandSampleSink* WFMPlugin::createRxChannelBS(DeviceSourceAPI *deviceAPI)
{ {

View File

@ -5,3 +5,4 @@ add_subdirectory(demodbfm)
add_subdirectory(demoddsd) add_subdirectory(demoddsd)
add_subdirectory(demodnfm) add_subdirectory(demodnfm)
add_subdirectory(demodssb) add_subdirectory(demodssb)
add_subdirectory(demodwfm)

View File

@ -0,0 +1,43 @@
project(wfm)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(PLUGIN_PREFIX "../../../plugins/channelrx/demodwfm")
set(wfm_SOURCES
${PLUGIN_PREFIX}/wfmdemod.cpp
${PLUGIN_PREFIX}/wfmdemodsettings.cpp
${PLUGIN_PREFIX}/wfmplugin.cpp
)
set(wfm_HEADERS
${PLUGIN_PREFIX}/wfmdemod.h
${PLUGIN_PREFIX}/wfmdemodsettings.h
${PLUGIN_PREFIX}/wfmplugin.h
)
include_directories(
.
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
)
#include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})
add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_SHARED)
#qt5_wrap_cpp(nfm_HEADERS_MOC ${nfm_HEADERS})
add_library(demodwfmsrv SHARED
${wfm_SOURCES}
${wfm_HEADERS_MOC}
)
target_link_libraries(demodwfmsrv
${QT_LIBRARIES}
sdrbase
)
qt5_use_modules(demodwfmsrv Core)
install(TARGETS demodwfmsrv DESTINATION lib/pluginssrv/channelrx)