1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-03-25 05:38:39 -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
plugins/channelrx
pluginssrv/channelrx

View File

@ -495,8 +495,7 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force)
if ((settings.m_squelch != m_settings.m_squelch) || force)
{
qDebug() << "BFMDemod::handleMessage: set m_squelchLevel";
m_squelchLevel = std::pow(10.0, settings.m_squelch / 20.0);
m_squelchLevel *= m_squelchLevel;
m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0);
}
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++)
{
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);
m_magsqSum += magsq;
m_movingAverage(magsq);
m_movingAverage(magsq);
m_magsqSum += magsq;
if (magsq > m_magsqPeak)
{
if (magsq > m_magsqPeak) {
m_magsqPeak = magsq;
}
m_magsqCount++;
if((Real) m_movingAverage >= m_squelchLevel)
m_squelchState = m_settings.m_rfBandwidth / 20; // decay rate
if (m_squelchState > 0)
{
m_squelchState--;
m_squelchOpen = true;
}
else
{
demod = 0;
m_squelchOpen = false;
}
if (m_settings.m_audioMute)
if (magsq >= m_squelchLevel)
{
if (m_squelchState < m_settings.m_rfBandwidth / 10) { // twice attack and decay rate
m_squelchState++;
}
}
else
{
if (m_squelchState > 0) {
m_squelchState--;
}
}
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;
}
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);
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);
if(res != m_audioBufferFill)
{
if (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);
if(res != m_audioBufferFill)
{
if (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)
{
qDebug() << "WFMDemod::applySettings: set m_squelchLevel";
m_squelchLevel = pow(10.0, settings.m_squelch / 20.0);
m_squelchLevel *= m_squelchLevel;
m_squelchLevel = pow(10.0, settings.m_squelch / 10.0);
}
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)

View File

@ -3,7 +3,9 @@
#include <QtPlugin>
#include "plugin/pluginapi.h"
#ifndef SERVER_MODE
#include "wfmdemodgui.h"
#endif
#include "wfmdemod.h"
const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
@ -34,10 +36,19 @@ void WFMPlugin::initPlugin(PluginAPI* pluginAPI)
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)
{
return WFMDemodGUI::create(m_pluginAPI, deviceUISet, rxChannel);
}
#endif
BasebandSampleSink* WFMPlugin::createRxChannelBS(DeviceSourceAPI *deviceAPI)
{

View File

@ -5,3 +5,4 @@ add_subdirectory(demodbfm)
add_subdirectory(demoddsd)
add_subdirectory(demodnfm)
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)