Custom bandwith parameter added

pull/70/head
Marcin Kondej 2019-01-07 17:50:34 +01:00
rodzic 8b8534d03e
commit f0354b15ee
3 zmienionych plików z 16 dodań i 9 usunięć

Wyświetl plik

@ -54,13 +54,14 @@ void sigIntHandler(int sigNum)
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
double frequency = 100.0; double frequency = 100.0;
double bandwidth = 0.1;
unsigned short dmaChannel = 0; unsigned short dmaChannel = 0;
bool loop = false; bool loop = false;
string filename; string filename;
bool showUsage = true; bool showUsage = true;
int opt, filesOffset; int opt, filesOffset;
while ((opt = getopt(argc, argv, "rf:d:v")) != -1) { while ((opt = getopt(argc, argv, "rf:d:b:v")) != -1) {
switch (opt) { switch (opt) {
case 'r': case 'r':
loop = true; loop = true;
@ -71,6 +72,9 @@ int main(int argc, char** argv)
case 'd': case 'd':
dmaChannel = ::atof(optarg); dmaChannel = ::atof(optarg);
break; break;
case 'b':
bandwidth = ::atof(optarg);
break;
case 'v': case 'v':
cout << EXECUTABLE << " version: " << VERSION << endl; cout << EXECUTABLE << " version: " << VERSION << endl;
return 0; return 0;
@ -100,7 +104,7 @@ int main(int argc, char** argv)
<< header.sampleRate << " Hz, " << header.sampleRate << " Hz, "
<< header.bitsPerSample << " bits, " << header.bitsPerSample << " bits, "
<< ((header.channels > 0x01) ? "stereo" : "mono") << endl; << ((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)); } while (play && (optind < argc));
} catch (exception &error) { } catch (exception &error) {
cout << "Error: " << error.what() << endl; cout << "Error: " << error.what() << endl;

Wyświetl plik

@ -178,7 +178,7 @@ unsigned Transmitter::getAddress(volatile void *object)
return (memSize) ? memAddress + ((unsigned)object - (unsigned)memAllocated) : 0x00000000; 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) { if (transmitting) {
throw ErrorReporter("Cannot play, transmitter already in use"); 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; bool eof = samples->size() < bufferSize;
unsigned clockDivisor = (unsigned)((500 << 12) / frequency + 0.5); unsigned clockDivisor = (unsigned)((500 << 12) / frequency + 0.5);
unsigned divisorRange = (unsigned)((500 << 12) / (frequency + 0.5 * bandwidth) + 0.5) - clockDivisor;
bool isError = false; bool isError = false;
string errorMessage; string errorMessage;
@ -252,7 +253,7 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh
#ifndef NO_PREEMP #ifndef NO_PREEMP
value = preEmp.filter(value); value = preEmp.filter(value);
#endif #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].transferInfo = (0x01 << 26) | (0x01 << 3);
dmaCb[cbIndex].srcAddress = getAddress(&clkDiv[i]); dmaCb[cbIndex].srcAddress = getAddress(&clkDiv[i]);
dmaCb[cbIndex].dstAddress = PERIPHERALS_PHYS_BASE | (CLK0_BASE_OFFSET + 0x04); 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)) { while (i == (((dma->cbAddress - getAddress(dmaCb)) / sizeof(DMAControllBlock)) >> 1)) {
usleep(1); usleep(1);
} }
clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * 16.0)); clkDiv[i] = (0x5A << 24) | (clockDivisor - (int)round(value * divisorRange));
cbIndex += 2; cbIndex += 2;
} }
delete samples; delete samples;
@ -330,10 +331,11 @@ void Transmitter::play(WaveReader &reader, double frequency, unsigned char dmaCh
unsigned sampleOffset = 0; unsigned sampleOffset = 0;
vector<Sample> *buffer = samples; vector<Sample> *buffer = samples;
void *transmitterParams[4] = { void *transmitterParams[5] = {
(void *)&buffer, (void *)&buffer,
(void *)&sampleOffset, (void *)&sampleOffset,
(void *)&clockDivisor, (void *)&clockDivisor,
(void *)&divisorRange,
(void *)&header.sampleRate (void *)&header.sampleRate
}; };
@ -389,7 +391,8 @@ void *Transmitter::transmit(void *params)
vector<Sample> **buffer = (vector<Sample> **)((void **)params)[0]; vector<Sample> **buffer = (vector<Sample> **)((void **)params)[0];
unsigned *sampleOffset = (unsigned *)((void **)params)[1]; unsigned *sampleOffset = (unsigned *)((void **)params)[1];
unsigned *clockDivisor = (unsigned *)((void **)params)[2]; 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; unsigned offset, length, prevOffset;
vector<Sample> *samples = NULL; vector<Sample> *samples = NULL;
@ -442,7 +445,7 @@ void *Transmitter::transmit(void *params)
#ifndef NO_PREEMP #ifndef NO_PREEMP
value = preEmp.filter(value); value = preEmp.filter(value);
#endif #endif
clk0->div = (0x5A << 24) | (*clockDivisor - (int)round(value * 16.0)); clk0->div = (0x5A << 24) | (*clockDivisor - (int)round(value * (*divisorRange)));
while (offset == prevOffset) { while (offset == prevOffset) {
usleep(1); // asm("nop"); usleep(1); // asm("nop");
current = *(unsigned long long *)&timer->low; current = *(unsigned long long *)&timer->low;

Wyświetl plik

@ -43,7 +43,7 @@ class Transmitter
public: public:
virtual ~Transmitter(); virtual ~Transmitter();
static Transmitter &getInstance(); 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(); void stop();
private: private:
Transmitter(); Transmitter();