AM modulator: fixed asym FFT filter management

pull/480/head
f4exb 2019-12-01 15:10:21 +01:00
rodzic cbb963754c
commit f7a241439c
2 zmienionych plików z 21 dodań i 17 usunięć

Wyświetl plik

@ -234,12 +234,6 @@
<layout class="QHBoxLayout" name="rfBandwidthLayout">
<item>
<widget class="QComboBox" name="modulation">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Modulation type</string>
</property>

Wyświetl plik

@ -66,11 +66,11 @@ ATVModSource::ATVModSource() :
{
scanCameras();
m_SSBFilter = new fftfilt(0, m_settings.m_rfBandwidth / m_channelSampleRate, m_ssbFftLen);
m_SSBFilterBuffer = new Complex[m_ssbFftLen>>1]; // filter returns data exactly half of its size
m_SSBFilter = new fftfilt(0, m_settings.m_rfBandwidth / (float) m_channelSampleRate, m_ssbFftLen); // arbitrary cutoff
m_SSBFilterBuffer = new Complex[m_ssbFftLen/2]; // filter returns data exactly half of its size
memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1));
m_DSBFilter = new fftfilt((2.0f * m_settings.m_rfBandwidth) / m_channelSampleRate, 2 * m_ssbFftLen);
m_DSBFilter = new fftfilt((2.0f * m_settings.m_rfBandwidth) / (float) m_channelSampleRate, 2*m_ssbFftLen); // arbitrary cutoff
m_DSBFilterBuffer = new Complex[m_ssbFftLen];
memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen));
@ -211,7 +211,7 @@ Complex& ATVModSource::modulateSSB(Real& sample)
if (n_out > 0)
{
memcpy((void *) m_SSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
std::copy(filtered, filtered + n_out, m_SSBFilterBuffer);
m_SSBFilterBufferIndex = 0;
}
@ -230,7 +230,7 @@ Complex& ATVModSource::modulateVestigialSSB(Real& sample)
if (n_out > 0)
{
memcpy((void *) m_DSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
std::copy(filtered, filtered + n_out, m_DSBFilterBuffer);
m_DSBFilterBufferIndex = 0;
}
@ -909,10 +909,17 @@ void ATVModSource::applyChannelSettings(int channelSampleRate, int channelFreque
m_tvSampleRate = channelSampleRate;
}
m_SSBFilter->create_filter(0, m_settings.m_rfBandwidth / m_tvSampleRate);
memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1));
m_SSBFilter->create_filter(0, m_settings.m_rfBandwidth / (float) m_tvSampleRate);
std::fill(m_SSBFilterBuffer, m_SSBFilterBuffer + (m_ssbFftLen/2), Complex{0.0, 0.0});
m_SSBFilterBufferIndex = 0;
m_DSBFilter->create_asym_filter(
m_settings.m_rfOppBandwidth / (float) m_tvSampleRate,
m_settings.m_rfBandwidth / (float) m_tvSampleRate
);
std::fill(m_DSBFilterBuffer, m_DSBFilterBuffer + m_ssbFftLen, Complex{0.0, 0.0});
m_DSBFilterBufferIndex = 0;
applyStandard(m_settings); // set all timings
m_settingsMutex.unlock();
@ -972,8 +979,8 @@ void ATVModSource::applySettings(const ATVModSettings& settings, bool force)
3.0);
}
m_SSBFilter->create_filter(0, settings.m_rfBandwidth / m_tvSampleRate);
memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1));
m_SSBFilter->create_filter(0, settings.m_rfBandwidth / (float) m_tvSampleRate);
std::fill(m_SSBFilterBuffer, m_SSBFilterBuffer + (m_ssbFftLen/2), Complex{0.0, 0.0});
m_SSBFilterBufferIndex = 0;
applyStandard(settings); // set all timings
@ -995,8 +1002,11 @@ void ATVModSource::applySettings(const ATVModSettings& settings, bool force)
{
m_settingsMutex.lock();
m_DSBFilter->create_asym_filter(settings.m_rfOppBandwidth / m_tvSampleRate, settings.m_rfBandwidth / m_tvSampleRate);
memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen));
m_DSBFilter->create_asym_filter(
settings.m_rfOppBandwidth / (float) m_tvSampleRate,
settings.m_rfBandwidth / (float) m_tvSampleRate
);
std::fill(m_DSBFilterBuffer, m_DSBFilterBuffer + m_ssbFftLen, Complex{0.0, 0.0});
m_DSBFilterBufferIndex = 0;
m_settingsMutex.unlock();