kopia lustrzana https://github.com/markondej/fm_transmitter
Custom bandwith parameter added
rodzic
8b8534d03e
commit
f0354b15ee
8
main.cpp
8
main.cpp
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Ładowanie…
Reference in New Issue