first pass at 700E integration
parent
409600d480
commit
ca79b5ca33
|
@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 2.8)
|
|||
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
||||
message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not "
|
||||
message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not "
|
||||
"allowed, please remove ./CMakeCache.txt and ./CMakeFiles/, create a "
|
||||
"separate build directory and run cmake from there.")
|
||||
endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
||||
|
@ -48,8 +48,8 @@ message(STATUS "Compilation date = XX${DATE_RESULT}XX")
|
|||
# Set FreeDV version and generate src/version.h
|
||||
#
|
||||
set(FREEDV_VERSION_MAJOR 1)
|
||||
set(FREEDV_VERSION_MINOR 4)
|
||||
set(FREEDV_VERSION_PATCH 3)
|
||||
set(FREEDV_VERSION_MINOR 5)
|
||||
set(FREEDV_VERSION_PATCH 0)
|
||||
set(FREEDV_VERSION_SUFFIX "devel")
|
||||
|
||||
set(FREEDV_VERSION ${FREEDV_VERSION_MAJOR}.${FREEDV_VERSION_MINOR})
|
||||
|
@ -110,9 +110,9 @@ endif(APPLE)
|
|||
set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "Verbose makefile.")
|
||||
set(USE_INTERNAL_CODEC2 FALSE CACHE BOOL
|
||||
"Download and build codec2 and lpcnetfreedv instead of using the system library.")
|
||||
set(USE_STATIC_DEPS FALSE CACHE BOOL
|
||||
set(USE_STATIC_DEPS FALSE CACHE BOOL
|
||||
"Download and build static libraries instead of system libraries.")
|
||||
set(USE_STATIC_PORTAUDIO FALSE CACHE BOOL
|
||||
set(USE_STATIC_PORTAUDIO FALSE CACHE BOOL
|
||||
"Download and build static portaudio instead of the system library.")
|
||||
set(USE_STATIC_SNDFILE FALSE CACHE BOOL
|
||||
"Download and build static sndfile instead of the system library.")
|
||||
|
@ -273,7 +273,7 @@ else(CODEC2_BUILD_DIR)
|
|||
include_directories(${CODEC2_INCLUDE_DIRS})
|
||||
else()
|
||||
message(FATAL_ERROR "codec2 library not found.
|
||||
Linux:
|
||||
Linux:
|
||||
Codec2 may not be in your distribution so build yourself or use the cmake option to build internally.
|
||||
Windws:
|
||||
It's easiest to use the cmake option: USE_INTERNAL_CODEC2 or use build trees for codec2 and lpcnetfreedv."
|
||||
|
@ -356,7 +356,7 @@ else(NOT USE_STATIC_SAMPLERATE)
|
|||
include(cmake/BuildSamplerate.cmake)
|
||||
endif(NOT USE_STATIC_SAMPLERATE)
|
||||
|
||||
#
|
||||
#
|
||||
# sndfile Library
|
||||
#
|
||||
if(NOT USE_STATIC_SNDFILE)
|
||||
|
@ -386,7 +386,7 @@ endif(NOT USE_STATIC_SNDFILE)
|
|||
if(NOT BOOTSTRAP_WXWIDGETS)
|
||||
set(WXCONFIG "" CACHE FILEPATH "Location of wx-config binary.")
|
||||
set(WXRC "" CACHE FILEPATH "Location of wxrc binary.")
|
||||
else(NOT BOOTSTRAP_WXWIDGETS)
|
||||
else(NOT BOOTSTRAP_WXWIDGETS)
|
||||
# set(WXCONFIG "${CMAKE_BINARY_DIR}/external/dist/bin/wx-config")
|
||||
# set(WXRC "${CMAKE_BINARY_DIR}/external/dist/bin/wxrc")
|
||||
# list(APPEND FREEDV_STATIC_DEPS wxWidgets)
|
||||
|
@ -475,7 +475,7 @@ On Linux systems try installing:
|
|||
endif()
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Freedv
|
||||
#
|
||||
add_subdirectory(src)
|
||||
|
|
|
@ -123,6 +123,8 @@ nudged. More **is not better** with the FreeDV transmit signal.
|
|||
Overdriving your transmitter will lead to a distorted transit signal, and
|
||||
a poor SNR at the receiver. This is a very common problem.
|
||||
|
||||
1. FreeDV 700D and 700E can drive your transmitter at an average power of 40% of it's peak power rating. For example 40W RMS for a 100W PEP radio. Make sure your transmitter can handle continuous power output at these levels, and reduce the power if necessary.
|
||||
|
||||
1. Adjust the microphone audio so the peaks are not clipping, and the
|
||||
average is about half the maximum.
|
||||
|
||||
|
@ -198,12 +200,7 @@ As an aid to the above, FreeDV will show the current mode on the bottom of the w
|
|||
|
||||
### Overdriving Transmit Level
|
||||
|
||||
This is a very common problem for first time FreeDV users. Adjust
|
||||
your transmit levels so the ALC is just being nudged. For a 100W
|
||||
PEP radio, your average power should be 20W.
|
||||
|
||||
More power is not better with FreeDV. An overdriven signal will have
|
||||
poor SNR at the receiver.
|
||||
This is a very common problem for first time FreeDV users. Adjust your transmit levels so the ALC is just being nudged. More power is not better with FreeDV. An overdriven signal will have poor SNR at the receiver. For FreeDV 700D/700E operation with the clipper, make sure your transmitter can sustain high average power levels without damage (e.g. 40W RMS on a 100W PEP radio).
|
||||
|
||||
### I can't set up FreeDV, especially the Sound Cards
|
||||
|
||||
|
@ -239,7 +236,7 @@ looks and sounds like.
|
|||
### Trouble getting Sync with 700D
|
||||
|
||||
You need to be within +/- 60 Hz on the transmit signal. It helps if
|
||||
both the tx and rx stations tune to known, exact frequencies such as
|
||||
both the Tx and Rx stations tune to known, exact frequencies such as
|
||||
exactly 7.177MHz. On channels with fast fading sync may take a few
|
||||
seconds.
|
||||
|
||||
|
@ -344,8 +341,9 @@ Mode | Min SNR | Fading | Latency | Speech Bandwidth | Speech Quality
|
|||
SSB | 0 | 8/10 | low | 2600 | 5/10
|
||||
1600 | 4 | 3/10 | low | 4000 | 4/10
|
||||
700C | 2 | 6/10 | low | 4000 | 3/10
|
||||
700D | -2 | 7/10 | high | 4000 | 3/10
|
||||
2020 | 4 | 5/10 | high | 8000 | 7/10
|
||||
700D | -2 | 4/10 | high | 4000 | 3/10
|
||||
700E | 1 | 7/10 | medium | 4000 | 3/10
|
||||
2020 | 4 | 4/10 | high | 8000 | 7/10
|
||||
Skype | - |- | medium | 8000 | 8/10
|
||||
|
||||
The Min SNR is roughly the SNR where you cannot converse without
|
||||
|
@ -374,43 +372,11 @@ FreeDV 700D is sensitive to tuning. To obtain sync you must be within
|
|||
modern radios which are generally accurate to +/-1 Hz, but requires
|
||||
skill and practice when used with older, VFO based radios.
|
||||
|
||||
_The rest of this section describes features and options specific to
|
||||
FreeDV 700D._
|
||||
### FreeDV 700E
|
||||
|
||||
Main GUI Page:
|
||||
FreeDV 700E was developed in December 2020 using lessons learned from on air operation of 700C and 700D. A variant of 700D, it uses a shorter frame size (80ms) to reduce latency and sync time. It is optimised for fast fading channels channels with up to 4Hz Doppler spread and 6ms delay spread. FreeDV 7000E uses the same 700 bit/s codec as FreeDV 700C and 700D. It requires about 3dB more power than 700D, but can operate reliably on fast fading channels.
|
||||
|
||||
1. Separate indication of Modem and (for 700D) Interleaver Sync. The
|
||||
number on the Interleaver Sync indicator is the interleaver size in
|
||||
160ms frames. This is usually set to 1.
|
||||
|
||||
1. ReSync button breaks 700D sync and forces it to try again. Useful
|
||||
if 700D gets a false sync in low SNR channels.
|
||||
|
||||
Tools - Options dialog:
|
||||
|
||||
1. Clipping: For 700C and 700D reduces the Peak/Average Power Ratio
|
||||
(PAPR) (also known as Crest Factor) from 12dB to 8dB by clipping the
|
||||
Tx signal. This will add a little noise to the Tx spectrum and Rx
|
||||
Scatter diagram, but MAY enable you to drive your Power Amplifier
|
||||
harder. Use with caution to avoid overloading your Power Amplifier.
|
||||
|
||||
1. Tx Band Pass Filter: limits the transmit bandwidth to about 1000
|
||||
Hz. Usually left on.
|
||||
|
||||
1. 700D Interleaver: The interleaver averages out errors over several
|
||||
frames, which improves performance for fast fading channels and
|
||||
channels with burst errors. A 16 frame interleaver will improve
|
||||
performance by 4dB. However interleaving adds delay, and delays sync.
|
||||
Both the tx and rx must have the same interleaver setting. For
|
||||
example a setting of 2 means we average errors over 2 160ms frames,
|
||||
and introduces 2x160=320ms delay in both the Tx and Rx (640ms total).
|
||||
The interleaver is usually set to 1.
|
||||
|
||||
1. 700D Manual Unsync: Sync must be broken manually (ReSync button)
|
||||
when this option is selected. Disables automatic falling out of
|
||||
sync. An experimental feature that may be useful for ensuring 700D stays
|
||||
in sync during long fades, to avoid long resync delays with the
|
||||
interleaver.
|
||||
The 700E release also includes optional compression (clipping) of the 700D an 700E transmit waveforms to reduce the Peak to Average Power Ratio to about 4dB. For example a 100W PEP transmitter can be driven to about 40W RMS. This is an improvement of 6dB over previous releases of FreeDV 700D. Before enabling the clipper make sure your transmitter is capable of handling sustained high average power without damage. Clipping can be enabled via Tools-Options.
|
||||
|
||||
### FreeDV 2020
|
||||
|
||||
|
@ -466,7 +432,7 @@ This section describes features on Tools-Options. Many of these features are al
|
|||
|
||||
Control | Description
|
||||
--- | --- |
|
||||
Clipping | Hard clipping of transmit waveform to increase the average power, at the expense of some distortion
|
||||
Clipping | Increases the average power (700C/700D/700E). Make sure you transmitter can handle high RMS powers before using!
|
||||
700C Diversity Combine | Combining of two sets of 700C carriers for better fading channel performance
|
||||
700D Interleaver | How many 700D frames to Interleave, larger leads to better fading channel performance but more latency
|
||||
700D Tx Band Pass Filter | Reduces 700D TX spectrum bandwidth
|
||||
|
@ -647,6 +613,11 @@ LDPC | Low Density Parity Check Codes - a family of powerful FEC codes
|
|||
|
||||
## Release Notes
|
||||
|
||||
### V1.5.0 December 2020
|
||||
|
||||
1. FreeDV 700E, better performance than 700D on fast fading channels
|
||||
1. FreeDV 700D/700E clipper to increase average transmit power by 6dB
|
||||
|
||||
### V1.4.3 August 2020
|
||||
|
||||
1. Maintenance Release (no major new features)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// Purpose: Dialog for controlling Codec audio filtering
|
||||
// Date: Nov 25 2012
|
||||
// Authors: David Rowe, David Witten
|
||||
//
|
||||
//
|
||||
// License:
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
|
@ -34,7 +34,7 @@
|
|||
#define MAX_GAIN 20
|
||||
|
||||
#define MAX_LOG10_Q 1.0
|
||||
#define MIN_LOG10_Q -1.0
|
||||
#define MIN_LOG10_Q -1.0
|
||||
|
||||
// DFT parameters
|
||||
|
||||
|
@ -92,9 +92,9 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
|
|||
sbSizer_speexpp->Add(m_ckboxSpeexpp, wxALIGN_LEFT, 2);
|
||||
m_ckboxSpeexpp->SetToolTip(_("Enable noise supression, dereverberation, AGC of mic signal"));
|
||||
|
||||
m_ckbox700C_EQ = new wxCheckBox(this, wxID_ANY, _("700C/700D Auto EQ"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
|
||||
m_ckbox700C_EQ = new wxCheckBox(this, wxID_ANY, _("700C/700D/700E Auto EQ"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
|
||||
sbSizer_speexpp->Add(m_ckbox700C_EQ, wxALIGN_LEFT, 2);
|
||||
m_ckbox700C_EQ->SetToolTip(_("Automatic equalisation for FreeDV 700C and FreeDV 700D Codec input audio"));
|
||||
m_ckbox700C_EQ->SetToolTip(_("Automatic equalisation for FreeDV 700C/700D/700E Codec input audio"));
|
||||
|
||||
bSizer30->Add(sbSizer_speexpp, 0, wxALL, 0);
|
||||
|
||||
|
@ -129,7 +129,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
|
|||
m_SpkOutDefault = new wxButton(this, wxID_ANY, wxT("Default"));
|
||||
eqSpkOutSizer2->Add(m_SpkOutDefault,0,wxALIGN_CENTRE_VERTICAL|wxLEFT,20);
|
||||
eqSpkOutSizer->Add(eqSpkOutSizer2);
|
||||
|
||||
|
||||
bSizer30->Add(eqMicInSizer, 0, wxALL, 0);
|
||||
bSizer30->Add(eqSpkOutSizer, 0, wxALL, 0);
|
||||
|
||||
|
@ -150,7 +150,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
|
|||
m_auiNotebook->SetFont(wxFont(8, 70, 90, 90, false, wxEmptyString));
|
||||
|
||||
bSizer30->Add(m_auiNotebook, 0, wxEXPAND|wxALL, 3);
|
||||
|
||||
|
||||
m_MicInFreqRespPlot = new PlotSpectrum((wxFrame*) m_auiNotebook, m_MicInMagdB, F_MAG_N, FILTER_MIN_MAG_DB, FILTER_MAX_MAG_DB);
|
||||
m_auiNotebook->AddPage(m_MicInFreqRespPlot, _("Microphone In Equaliser"));
|
||||
|
||||
|
@ -173,7 +173,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
|
|||
this->Layout();
|
||||
|
||||
this->Centre(wxBOTH);
|
||||
|
||||
|
||||
// Connect Events -------------------------------------------------------
|
||||
|
||||
this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(FilterDlg::OnInitDialog));
|
||||
|
@ -290,8 +290,8 @@ EQ FilterDlg::newEQ(wxSizer *bs, wxString eqName, float maxFreqHz, bool enableQ)
|
|||
|
||||
wxStaticBoxSizer *bsEQ = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, eqName), wxHORIZONTAL);
|
||||
|
||||
newEQControl(&eq.sliderFreq, &eq.valueFreq, bsEQ, "Freq");
|
||||
eq.maxFreqHz = maxFreqHz;
|
||||
newEQControl(&eq.sliderFreq, &eq.valueFreq, bsEQ, "Freq");
|
||||
eq.maxFreqHz = maxFreqHz;
|
||||
eq.sliderFreqId = eq.sliderFreq->GetId();
|
||||
|
||||
newEQControl(&eq.sliderGain, &eq.valueGain, bsEQ, "Gain");
|
||||
|
@ -329,7 +329,7 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
|
|||
|
||||
// Mic In Equaliser
|
||||
|
||||
m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz;
|
||||
m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz;
|
||||
m_MicInBass.freqHz = limit(m_MicInBass.freqHz, 1.0, MAX_FREQ_BASS);
|
||||
setFreq(&m_MicInBass);
|
||||
m_MicInBass.gaindB = wxGetApp().m_MicInBassGaindB;
|
||||
|
@ -339,14 +339,14 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
|
|||
m_MicInTreble.freqHz = wxGetApp().m_MicInTrebleFreqHz;
|
||||
m_MicInTreble.freqHz = limit(m_MicInTreble.freqHz, 1.0, MAX_FREQ_TREBLE);
|
||||
setFreq(&m_MicInTreble);
|
||||
m_MicInTreble.gaindB = wxGetApp().m_MicInTrebleGaindB;
|
||||
m_MicInTreble.gaindB = wxGetApp().m_MicInTrebleGaindB;
|
||||
m_MicInTreble.gaindB = limit(m_MicInTreble.gaindB, MIN_GAIN, MAX_GAIN);
|
||||
setGain(&m_MicInTreble);
|
||||
|
||||
m_MicInMid.freqHz = wxGetApp().m_MicInMidFreqHz;
|
||||
m_MicInMid.freqHz = wxGetApp().m_MicInMidFreqHz;
|
||||
m_MicInMid.freqHz = limit(m_MicInMid.freqHz, 1.0, MAX_FREQ_TREBLE);
|
||||
setFreq(&m_MicInMid);
|
||||
m_MicInMid.gaindB = wxGetApp().m_MicInMidGaindB;
|
||||
m_MicInMid.gaindB = wxGetApp().m_MicInMidGaindB;
|
||||
m_MicInMid.gaindB = limit(m_MicInMid.gaindB, MIN_GAIN, MAX_GAIN);
|
||||
setGain(&m_MicInMid);
|
||||
m_MicInMid.Q = wxGetApp().m_MicInMidQ;
|
||||
|
@ -356,20 +356,20 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
|
|||
m_MicInEnable->SetValue(wxGetApp().m_MicInEQEnable);
|
||||
|
||||
plotMicInFilterSpectrum();
|
||||
|
||||
|
||||
// Spk Out Equaliser
|
||||
|
||||
m_SpkOutBass.freqHz = wxGetApp().m_SpkOutBassFreqHz;
|
||||
m_SpkOutBass.freqHz = limit(m_SpkOutBass.freqHz, 1.0, MAX_FREQ_BASS);
|
||||
setFreq(&m_SpkOutBass);
|
||||
m_SpkOutBass.gaindB = wxGetApp().m_SpkOutBassGaindB;
|
||||
m_SpkOutBass.gaindB = wxGetApp().m_SpkOutBassGaindB;
|
||||
m_SpkOutBass.gaindB = limit(m_SpkOutBass.gaindB, MIN_GAIN, MAX_GAIN);
|
||||
setGain(&m_SpkOutBass);
|
||||
|
||||
m_SpkOutTreble.freqHz = wxGetApp().m_SpkOutTrebleFreqHz;
|
||||
m_SpkOutTreble.freqHz = wxGetApp().m_SpkOutTrebleFreqHz;
|
||||
m_SpkOutTreble.freqHz = limit(m_SpkOutTreble.freqHz, 1.0, MAX_FREQ_TREBLE);
|
||||
setFreq(&m_SpkOutTreble);
|
||||
m_SpkOutTreble.gaindB = wxGetApp().m_SpkOutTrebleGaindB;
|
||||
m_SpkOutTreble.gaindB = wxGetApp().m_SpkOutTrebleGaindB;
|
||||
m_SpkOutTreble.gaindB = limit(m_SpkOutTreble.gaindB, MIN_GAIN, MAX_GAIN);
|
||||
setGain(&m_SpkOutTreble);
|
||||
|
||||
|
@ -398,7 +398,7 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
|
|||
|
||||
// Speex Pre-Processor
|
||||
wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue();
|
||||
|
||||
|
||||
// Codec 2 700C EQ
|
||||
wxGetApp().m_700C_EQ = m_ckbox700C_EQ->GetValue();
|
||||
|
||||
|
@ -488,18 +488,18 @@ void FilterDlg::OnMicInDefault(wxCommandEvent& event)
|
|||
{
|
||||
m_MicInBass.freqHz = 100.0;
|
||||
m_MicInBass.gaindB = 0.0;
|
||||
setFreq(&m_MicInBass); setGain(&m_MicInBass);
|
||||
setFreq(&m_MicInBass); setGain(&m_MicInBass);
|
||||
|
||||
m_MicInTreble.freqHz = 3000.0;
|
||||
m_MicInTreble.gaindB = 0.0;
|
||||
setFreq(&m_MicInTreble); setGain(&m_MicInTreble);
|
||||
setFreq(&m_MicInTreble); setGain(&m_MicInTreble);
|
||||
|
||||
m_MicInMid.freqHz = 1500.0;
|
||||
m_MicInMid.gaindB = 0.0;
|
||||
m_MicInMid.Q = 1.0;
|
||||
setFreq(&m_MicInMid); setGain(&m_MicInMid); setQ(&m_MicInMid);
|
||||
setFreq(&m_MicInMid); setGain(&m_MicInMid); setQ(&m_MicInMid);
|
||||
|
||||
plotMicInFilterSpectrum();
|
||||
plotMicInFilterSpectrum();
|
||||
adjRunTimeMicInFilter();
|
||||
}
|
||||
|
||||
|
@ -507,16 +507,16 @@ void FilterDlg::OnSpkOutDefault(wxCommandEvent& event)
|
|||
{
|
||||
m_SpkOutBass.freqHz = 100.0;
|
||||
m_SpkOutBass.gaindB = 0.0;
|
||||
setFreq(&m_SpkOutBass); setGain(&m_SpkOutBass);
|
||||
setFreq(&m_SpkOutBass); setGain(&m_SpkOutBass);
|
||||
|
||||
m_SpkOutTreble.freqHz = 3000.0;
|
||||
m_SpkOutTreble.gaindB = 0.0;
|
||||
setFreq(&m_SpkOutTreble); setGain(&m_SpkOutTreble);
|
||||
setFreq(&m_SpkOutTreble); setGain(&m_SpkOutTreble);
|
||||
|
||||
m_SpkOutMid.freqHz = 1500.0;
|
||||
m_SpkOutMid.gaindB = 0.0;
|
||||
m_SpkOutMid.Q = 1.0;
|
||||
setFreq(&m_SpkOutMid); setGain(&m_SpkOutMid); setQ(&m_SpkOutMid);
|
||||
setFreq(&m_SpkOutMid); setGain(&m_SpkOutMid); setQ(&m_SpkOutMid);
|
||||
|
||||
plotSpkOutFilterSpectrum();
|
||||
adjRunTimeSpkOutFilter();
|
||||
|
@ -562,9 +562,9 @@ void FilterDlg::setCodec2(void) {
|
|||
if (m_running) {
|
||||
struct CODEC2 *c2 = freedv_get_codec2(g_pfreedv);
|
||||
if (c2 != NULL) {
|
||||
codec2_set_lpc_post_filter(c2,
|
||||
m_codec2LPCPostFilterEnable->GetValue(),
|
||||
m_codec2LPCPostFilterBassBoost->GetValue(),
|
||||
codec2_set_lpc_post_filter(c2,
|
||||
m_codec2LPCPostFilterEnable->GetValue(),
|
||||
m_codec2LPCPostFilterBassBoost->GetValue(),
|
||||
m_beta, m_gamma);
|
||||
}
|
||||
}
|
||||
|
@ -579,11 +579,11 @@ void FilterDlg::setGamma(void) {
|
|||
}
|
||||
|
||||
void FilterDlg::OnEnable(wxScrollEvent& event) {
|
||||
setCodec2();
|
||||
setCodec2();
|
||||
}
|
||||
|
||||
void FilterDlg::OnBassBoost(wxScrollEvent& event) {
|
||||
setCodec2();
|
||||
setCodec2();
|
||||
}
|
||||
|
||||
void FilterDlg::OnBetaScroll(wxScrollEvent& event) {
|
||||
|
@ -606,7 +606,7 @@ void FilterDlg::OnSpeexppEnable(wxScrollEvent& event) {
|
|||
|
||||
void FilterDlg::On700C_EQ(wxScrollEvent& event) {
|
||||
wxGetApp().m_700C_EQ = m_ckbox700C_EQ->GetValue();
|
||||
if (m_running && ((g_mode == FREEDV_MODE_700C) || (g_mode == FREEDV_MODE_700D))) {
|
||||
if (m_running && ((g_mode == FREEDV_MODE_700C) || (g_mode == FREEDV_MODE_700D) || (g_mode == FREEDV_MODE_700E))) {
|
||||
freedv_set_eq(g_pfreedv, wxGetApp().m_700C_EQ);
|
||||
}
|
||||
}
|
||||
|
@ -656,7 +656,7 @@ void FilterDlg::setGain(EQ *eq)
|
|||
void FilterDlg::sliderToGain(EQ *eq, bool micIn)
|
||||
{
|
||||
float range = MAX_GAIN-MIN_GAIN;
|
||||
|
||||
|
||||
eq->gaindB = MIN_GAIN + range*((float)eq->sliderGain->GetValue()/SLIDER_MAX);
|
||||
//printf("gaindB: %f\n", eq->gaindB);
|
||||
setGain(eq);
|
||||
|
@ -668,7 +668,7 @@ void FilterDlg::sliderToGain(EQ *eq, bool micIn)
|
|||
plotSpkOutFilterSpectrum();
|
||||
adjRunTimeSpkOutFilter();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void FilterDlg::setQ(EQ *eq)
|
||||
|
@ -686,7 +686,7 @@ void FilterDlg::setQ(EQ *eq)
|
|||
void FilterDlg::sliderToQ(EQ *eq, bool micIn)
|
||||
{
|
||||
float log10_range = MAX_LOG10_Q - MIN_LOG10_Q;
|
||||
|
||||
|
||||
float sliderNorm = (float)eq->sliderQ->GetValue()/SLIDER_MAX;
|
||||
float log10Q = MIN_LOG10_Q + sliderNorm*(log10_range);
|
||||
eq->Q = pow(10.0, log10Q);
|
||||
|
@ -718,7 +718,7 @@ void FilterDlg::adjRunTimeMicInFilter(void) {
|
|||
*m_newMicInFilter = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FilterDlg::adjRunTimeSpkOutFilter(void) {
|
||||
// signal an adjustment in running filter coeffs
|
||||
|
||||
|
@ -727,7 +727,7 @@ void FilterDlg::adjRunTimeSpkOutFilter(void) {
|
|||
*m_newSpkOutFilter = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void FilterDlg::plotFilterSpectrum(EQ *eqBass, EQ *eqMid, EQ *eqTreble, PlotSpectrum* freqRespPlot, float *magdB) {
|
||||
char *argBass[10];
|
||||
|
@ -744,21 +744,21 @@ void FilterDlg::plotFilterSpectrum(EQ *eqBass, EQ *eqMid, EQ *eqTreble, PlotSpec
|
|||
argTreble[i] = &argstorage[i][0];
|
||||
argMid[i] = &argstorage[i][0];
|
||||
}
|
||||
sprintf(argBass[0], "bass");
|
||||
sprintf(argBass[0], "bass");
|
||||
sprintf(argBass[1], "%f", eqBass->gaindB+1E-6);
|
||||
sprintf(argBass[2], "%f", eqBass->freqHz);
|
||||
sprintf(argBass[2], "%f", eqBass->freqHz);
|
||||
|
||||
calcFilterSpectrum(magBass, 2, argBass);
|
||||
|
||||
sprintf(argTreble[0], "treble");
|
||||
sprintf(argTreble[0], "treble");
|
||||
sprintf(argTreble[1], "%f", eqTreble->gaindB+1E-6);
|
||||
sprintf(argTreble[2], "%f", eqTreble->freqHz);
|
||||
sprintf(argTreble[2], "%f", eqTreble->freqHz);
|
||||
|
||||
calcFilterSpectrum(magTreble, 2, argTreble);
|
||||
|
||||
sprintf(argTreble[0], "equalizer");
|
||||
sprintf(argTreble[1], "%f", eqMid->freqHz);
|
||||
sprintf(argTreble[2], "%f", eqMid->Q);
|
||||
sprintf(argTreble[0], "equalizer");
|
||||
sprintf(argTreble[1], "%f", eqMid->freqHz);
|
||||
sprintf(argTreble[2], "%f", eqMid->Q);
|
||||
sprintf(argTreble[3], "%f", eqMid->gaindB+1E-6);
|
||||
|
||||
calcFilterSpectrum(magMid, 3, argMid);
|
||||
|
@ -789,7 +789,7 @@ void FilterDlg::calcFilterSpectrum(float magdB[], int argc, char *argv[]) {
|
|||
sox_biquad_filter(sbq, out, in, NIMP);
|
||||
//for(i=0; i<NIMP; i++)
|
||||
// printf("%d\n", out[i]);
|
||||
|
||||
|
||||
sox_biquad_destroy(sbq);
|
||||
|
||||
//for(i=0; i<NIMP; i++)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@
|
|||
// Purpose: Implements simple wxWidgets application with GUI.
|
||||
// Created: Apr. 9, 2012
|
||||
// Authors: David Rowe, David Witten
|
||||
//
|
||||
//
|
||||
// License:
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
|
@ -338,20 +338,12 @@ TopFrame::TopFrame(wxString plugInName, wxWindow* parent, wxWindowID id, const w
|
|||
wxStaticBoxSizer* sbSizer_mode;
|
||||
sbSizer_mode = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Mode")), wxVERTICAL);
|
||||
|
||||
#ifdef DISABLED_FEATURE
|
||||
m_rb1400old = new wxRadioButton( this, wxID_ANY, wxT("1400 V0.91"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
|
||||
sbSizer_mode->Add(m_rb1400old, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb1400 = new wxRadioButton( this, wxID_ANY, wxT("1400"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
sbSizer_mode->Add(m_rb1400, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb700 = new wxRadioButton( this, wxID_ANY, wxT("700"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
|
||||
sbSizer_mode->Add(m_rb700, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb700b = new wxRadioButton( this, wxID_ANY, wxT("700B"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
|
||||
sbSizer_mode->Add(m_rb700b, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
#endif
|
||||
m_rb700c = new wxRadioButton( this, wxID_ANY, wxT("700C"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
|
||||
sbSizer_mode->Add(m_rb700c, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb700d = new wxRadioButton( this, wxID_ANY, wxT("700D"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
sbSizer_mode->Add(m_rb700d, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb700e = new wxRadioButton( this, wxID_ANY, wxT("700E"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
sbSizer_mode->Add(m_rb700e, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb800xa = new wxRadioButton( this, wxID_ANY, wxT("800XA"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
sbSizer_mode->Add(m_rb800xa, 0, wxALIGN_LEFT|wxALL, 1);
|
||||
m_rb1600 = new wxRadioButton( this, wxID_ANY, wxT("1600"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
|
@ -476,7 +468,7 @@ TopFrame::TopFrame(wxString plugInName, wxWindow* parent, wxWindowID id, const w
|
|||
//------------------------------
|
||||
m_togBtnVoiceKeyer = new wxToggleButton(this, wxID_ANY, _("Voice Keyer"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
m_togBtnVoiceKeyer->SetToolTip(_("Toggle Voice Keyer"));
|
||||
wxBoxSizer* bSizer13a = new wxBoxSizer(wxVERTICAL);
|
||||
wxBoxSizer* bSizer13a = new wxBoxSizer(wxVERTICAL);
|
||||
bSizer13a->Add(m_togBtnVoiceKeyer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
|
||||
sbSizer5->Add(bSizer13a, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
|
||||
|
||||
|
@ -632,4 +624,3 @@ TopFrame::~TopFrame()
|
|||
m_btnTogPTT->Disconnect(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler(TopFrame::OnTogBtnPTT), NULL, this);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -112,9 +112,10 @@ class TopFrame : public wxFrame
|
|||
wxStaticText *m_textSync;
|
||||
wxStaticText *m_textInterleaverSync;
|
||||
wxButton *m_BtnReSync;
|
||||
|
||||
|
||||
wxRadioButton *m_rb700c;
|
||||
wxRadioButton *m_rb700d;
|
||||
wxRadioButton *m_rb700e;
|
||||
wxRadioButton *m_rb800xa;
|
||||
wxRadioButton *m_rb1600;
|
||||
wxRadioButton *m_rb2400a;
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue