aboutsummaryrefslogtreecommitdiffstats
path: root/src/DabMod.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2024-10-08 15:25:45 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2024-10-08 15:25:45 +0200
commit1d83a2b247f8e83bbce802a272ffa165bbc6333f (patch)
tree116a24ec03eabfef4bd2dd73efeb97ecaad57d67 /src/DabMod.cpp
parent8736f6160aeafe7a177cb6143fea80157e174e52 (diff)
downloaddabmod-1d83a2b247f8e83bbce802a272ffa165bbc6333f.tar.gz
dabmod-1d83a2b247f8e83bbce802a272ffa165bbc6333f.tar.bz2
dabmod-1d83a2b247f8e83bbce802a272ffa165bbc6333f.zip
Get fixed_point working with USRP
Diffstat (limited to 'src/DabMod.cpp')
-rw-r--r--src/DabMod.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/DabMod.cpp b/src/DabMod.cpp
index 5f8412b..739fef1 100644
--- a/src/DabMod.cpp
+++ b/src/DabMod.cpp
@@ -72,10 +72,12 @@
* samples can have peaks up to about 48000. The value of 50000
* should guarantee that with a digital gain of 1.0, UHD never clips
* our samples.
+ *
+ * This only applies when fixed_point == false.
*/
static const float normalise_factor = 50000.0f;
-//Empirical normalisation factors used to normalise the samples to amplitude 1.
+// Empirical normalisation factors used to normalise the samples to amplitude 1.
static const float normalise_factor_file_fix = 81000.0f;
static const float normalise_factor_file_var = 46000.0f;
static const float normalise_factor_file_max = 46000.0f;
@@ -249,16 +251,12 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
{
shared_ptr<ModOutput> output;
- if (s.fixedPoint) {
- if (s.useFileOutput) {
+ if (s.useFileOutput) {
+ if (s.fixedPoint) {
+ // Intentionally ignore fileOutputFormat, it is always sc16
output = make_shared<OutputFile>(s.outputName, s.fileOutputShowMetadata);
}
- else {
- throw runtime_error("Fixed point only works with file output");
- }
- }
- else if (s.useFileOutput) {
- if (s.fileOutputFormat == "complexf") {
+ else if (s.fileOutputFormat == "complexf") {
output = make_shared<OutputFile>(s.outputName, s.fileOutputShowMetadata);
}
else if (s.fileOutputFormat == "complexf_normalised") {
@@ -294,6 +292,7 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
else if (s.useUHDOutput) {
s.normalise = 1.0f / normalise_factor;
s.sdr_device_config.sampleRate = s.outputRate;
+ s.sdr_device_config.fixedPoint = s.fixedPoint;
auto uhddevice = make_shared<Output::UHD>(s.sdr_device_config);
output = make_shared<Output::SDR>(s.sdr_device_config, uhddevice);
rcs.enrol((Output::SDR*)output.get());
@@ -304,6 +303,7 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
/* We normalise the same way as for the UHD output */
s.normalise = 1.0f / normalise_factor;
s.sdr_device_config.sampleRate = s.outputRate;
+ if (s.fixedPoint) throw runtime_error("soapy fixed_point unsupported");
auto soapydevice = make_shared<Output::Soapy>(s.sdr_device_config);
output = make_shared<Output::SDR>(s.sdr_device_config, soapydevice);
rcs.enrol((Output::SDR*)output.get());
@@ -313,6 +313,7 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
else if (s.useDexterOutput) {
/* We normalise specifically range [-32768; 32767] */
s.normalise = 32767.0f / normalise_factor;
+ if (s.fixedPoint) throw runtime_error("dexter fixed_point unsupported");
s.sdr_device_config.sampleRate = s.outputRate;
auto dexterdevice = make_shared<Output::Dexter>(s.sdr_device_config);
output = make_shared<Output::SDR>(s.sdr_device_config, dexterdevice);
@@ -323,6 +324,7 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
else if (s.useLimeOutput) {
/* We normalise the same way as for the UHD output */
s.normalise = 1.0f / normalise_factor;
+ if (s.fixedPoint) throw runtime_error("limesdr fixed_point unsupported");
s.sdr_device_config.sampleRate = s.outputRate;
auto limedevice = make_shared<Output::Lime>(s.sdr_device_config);
output = make_shared<Output::SDR>(s.sdr_device_config, limedevice);
@@ -333,6 +335,7 @@ static shared_ptr<ModOutput> prepare_output(mod_settings_t& s)
else if (s.useBladeRFOutput) {
/* We normalise specifically for the BladeRF output : range [-2048; 2047] */
s.normalise = 2047.0f / normalise_factor;
+ if (s.fixedPoint) throw runtime_error("bladerf fixed_point unsupported");
s.sdr_device_config.sampleRate = s.outputRate;
auto bladerfdevice = make_shared<Output::BladeRF>(s.sdr_device_config);
output = make_shared<Output::SDR>(s.sdr_device_config, bladerfdevice);
@@ -443,7 +446,10 @@ int launch_modulator(int argc, char* argv[])
}
std::string output_format;
- if (mod_settings.useFileOutput and
+ if (mod_settings.fixedPoint) {
+ output_format = "fixedpoint";
+ }
+ else if (mod_settings.useFileOutput and
(mod_settings.fileOutputFormat == "s8" or
mod_settings.fileOutputFormat == "u8" or
mod_settings.fileOutputFormat == "s16")) {