From f0354b15ee77d4df022f2dab2952edab992d861c Mon Sep 17 00:00:00 2001 From: Marcin Kondej Date: Mon, 7 Jan 2019 17:50:34 +0100 Subject: [PATCH] Custom bandwith parameter added --- main.cpp | 8 ++++++-- transmitter.cpp | 15 +++++++++------ transmitter.h | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/main.cpp b/main.cpp index d528a64..d7bb83a 100644 --- a/main.cpp +++ b/main.cpp @@ -54,13 +54,14 @@ void sigIntHandler(int sigNum) int main(int argc, char** argv) { double frequency = 100.0; + double bandwidth = 0.1; unsigned short dmaChannel = 0; bool loop = false; string filename; bool showUsage = true; int opt, filesOffset; - while ((opt = getopt(argc, argv, "rf:d:v")) != -1) { + while ((opt = getopt(argc, argv, "rf:d:b:v")) != -1) { switch (opt) { case 'r': loop = true; @@ -71,6 +72,9 @@ int main(int argc, char** argv) case 'd': dmaChannel = ::atof(optarg); break; + case 'b': + bandwidth = ::atof(optarg); + break; case 'v': cout << EXECUTABLE << " version: " << VERSION << endl; return 0; @@ -100,7 +104,7 @@ int main(int argc, char** argv) << header.sampleRate << " Hz, " << header.bitsPerSample << " bits, " << ((header.channels > 0x01) ? "stereo" : "mono") << endl; - transmitter->play(reader, frequency, dmaChannel, optind < argc); + transmitter->play(reader, frequency, bandwidth, dmaChannel, optind < argc); } while (play && (optind < argc)); } catch (exception &error) { cout << "Error: " << error.what() << endl; diff --git a/transmitter.cpp b/transmitter.cpp index 93fbb5f..cd4ba71 100644 --- a/transmitter.cpp +++ b/transmitter.cpp @@ -178,7 +178,7 @@ unsigned Transmitter::getAddress(volatile void *object) return (memSize) ? memAddress + ((unsigned)object - (unsigned)memAllocated) : 0x00000000; } -void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaChannel, bool preserveCarrierOnExit) +void Transmitter::play(WaveReader &reader, double frequency, double bandwidth, unsigned char dmaChannel, bool preserveCarrierOnExit) { if (transmitting) { throw ErrorReporter("Cannot play, transmitter already in use"); @@ -196,6 +196,7 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh bool eof = samples->size() < bufferSize; unsigned clockDivisor = (unsigned)((500 << 12) / frequency + 0.5); + unsigned divisorRange = (unsigned)((500 << 12) / (frequency + 0.5 * bandwidth) + 0.5) - clockDivisor; bool isError = false; string errorMessage; @@ -252,7 +253,7 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh #ifndef NO_PREEMP value = preEmp.filter(value); #endif - clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * 16.0)); + clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * divisorRange)); dmaCb[cbIndex].transferInfo = (0x01 << 26) | (0x01 << 3); dmaCb[cbIndex].srcAddress = getAddress(&clkDiv[i]); dmaCb[cbIndex].dstAddress = PERIPHERALS_PHYS_BASE | (CLK0_BASE_OFFSET + 0x04); @@ -297,7 +298,7 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh while (i == (((dma->cbAddress - getAddress(dmaCb)) / sizeof(DMAControllBlock)) >> 1)) { usleep(1); } - clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * 16.0)); + clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * divisorRange)); cbIndex += 2; } delete samples; @@ -330,10 +331,11 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh unsigned sampleOffset = 0; vector *buffer = samples; - void *transmitterParams[4] = { + void *transmitterParams[5] = { (void *)&buffer, (void *)&sampleOffset, (void *)&clockDivisor, + (void *)&divisorRange, (void *)&header.sampleRate }; @@ -389,7 +391,8 @@ void *Transmitter::transmit(void *params) vector **buffer = (vector **)((void **)params)[0]; unsigned *sampleOffset = (unsigned *)((void **)params)[1]; unsigned *clockDivisor = (unsigned *)((void **)params)[2]; - unsigned *sampleRate = (unsigned *)((void **)params)[3]; + unsigned *divisorRange = (unsigned *)((void **)params)[3]; + unsigned *sampleRate = (unsigned *)((void **)params)[4]; unsigned offset, length, prevOffset; vector *samples = NULL; @@ -442,7 +445,7 @@ void *Transmitter::transmit(void *params) #ifndef NO_PREEMP value = preEmp.filter(value); #endif - clk0->div = (0x5A << 24) | (*clockDivisor - (int)round(value * 16.0)); + clk0->div = (0x5A << 24) | (*clockDivisor - (int)round(value * (*divisorRange))); while (offset == prevOffset) { usleep(1); // asm("nop"); current = *(unsigned long long *)&timer->low; diff --git a/transmitter.h b/transmitter.h index 913b28d..4f92517 100644 --- a/transmitter.h +++ b/transmitter.h @@ -43,7 +43,7 @@ class Transmitter public: virtual ~Transmitter(); static Transmitter &getInstance(); - void play(WaveReader &reader, double frequency, unsigned char dmaChannel, bool preserveCarrierOnExit); + void play(WaveReader &reader, double frequency, double bandwidth, unsigned char dmaChannel, bool preserveCarrierOnExit); void stop(); private: Transmitter();