Use float instead of double

pull/87/head
Marcin Kondej 2019-09-26 17:04:57 +02:00
rodzic 0b7423090f
commit f0966e73a3
5 zmienionych plików z 21 dodań i 22 usunięć

Wyświetl plik

@ -51,8 +51,8 @@ void sigIntHandler(int sigNum)
int main(int argc, char** argv)
{
double frequency = 100.0;
double bandwidth = 100.0;
float frequency = 100.f;
float bandwidth = 100.f;
uint16_t dmaChannel = 0;
bool loop = false;
std::string filename;

Wyświetl plik

@ -35,7 +35,7 @@
#include <climits>
Sample::Sample(uint8_t *data, uint16_t channels, uint16_t bitsPerChannel)
: value(0.)
: value(0.f)
{
int32_t sum = 0;
int16_t *channelValues = new int16_t[channels];
@ -48,25 +48,25 @@ Sample::Sample(uint8_t *data, uint16_t channels, uint16_t bitsPerChannel)
}
sum += channelValues[i];
}
value = 2 * sum / channels / static_cast<double>(USHRT_MAX);
value = 2 * sum / channels / static_cast<float>(USHRT_MAX);
delete[] channelValues;
}
double Sample::getMonoValue()
float Sample::getMonoValue()
{
return value;
}
#ifndef NO_PREEMP
PreEmphasis::PreEmphasis(uint32_t sampleRate)
: timeConst(sampleRate * 75.0e-6), prevValue(0.)
: timeConst(sampleRate * 75.0e-6f), prevValue(0.f)
{
}
double PreEmphasis::filter(double value)
float PreEmphasis::filter(float value)
{
prevValue = value;
value = value + (prevValue - value) / (1. - timeConst);
value = value + (prevValue - value) / (1.f - timeConst);
return value;
}
#endif

Wyświetl plik

@ -40,9 +40,9 @@ class Sample
{
public:
Sample(uint8_t *data, uint16_t channels, uint16_t bitsPerChannel);
double getMonoValue();
float getMonoValue();
protected:
double value;
float value;
};
#ifndef NO_PREEMP
@ -50,9 +50,9 @@ class PreEmphasis
{
public:
PreEmphasis(uint32_t sampleRate);
double filter(double value);
float filter(float value);
protected:
double timeConst, prevValue;
float timeConst, prevValue;
};
#endif

Wyświetl plik

@ -165,7 +165,7 @@ uint32_t Transmitter::getPeripheralsSize()
return size;
}
double Transmitter::getSourceFreq()
float Transmitter::getSourceFreq()
{
return (getPeripheralsVirtBaseAddress() == BCM2838_PERI_VIRT_BASE) ? BCM2838_PLLD_FREQ : BCM2835_PLLD_FREQ;
}
@ -214,7 +214,7 @@ void Transmitter::freeMemory(AllocatedMemory &memory)
volatile PWMRegisters *Transmitter::initPwmController()
{
volatile ClockRegisters *pwmClk = reinterpret_cast<ClockRegisters *>(getPeripheralVirtAddress(PWMCLK_BASE_OFFSET));
double pwmClkFreq = PWM_WRITES_PER_SAMPLE * PWM_CHANNEL_RANGE * sampleRate / 1000000;
float pwmClkFreq = PWM_WRITES_PER_SAMPLE * PWM_CHANNEL_RANGE * sampleRate / 1000000;
pwmClk->ctl = (0x5A << 24) | 0x06;
usleep(1000);
pwmClk->div = (0x5A << 24) | static_cast<uint32_t>(getSourceFreq() * (0x01 << 12) / pwmClkFreq);
@ -270,7 +270,7 @@ void Transmitter::closeClockOutput(volatile ClockRegisters *clock)
clock->ctl = (0x5A << 24) | 0x06;
}
void Transmitter::transmit(WaveReader &reader, double frequency, double bandwidth, uint8_t dmaChannel, bool preserveCarrierOnExit)
void Transmitter::transmit(WaveReader &reader, float frequency, float bandwidth, uint8_t dmaChannel, bool preserveCarrierOnExit)
{
if (transmitting) {
throw std::runtime_error("Cannot play, transmitter already in use");
@ -283,7 +283,7 @@ void Transmitter::transmit(WaveReader &reader, double frequency, double bandwidt
preserveCarrier = preserveCarrierOnExit;
clockDivisor = static_cast<uint32_t>(round(getSourceFreq() * (0x01 << 12) / frequency));
divisorRange = clockDivisor - static_cast<uint32_t>(round(getSourceFreq() * (0x01 << 12) / (frequency + 0.0005 * bandwidth)));
divisorRange = clockDivisor - static_cast<uint32_t>(round(getSourceFreq() * (0x01 << 12) / (frequency + 0.0005f * bandwidth)));
sampleRate = header.sampleRate;
output = (output != nullptr) ? output : initClockOutput();
@ -377,7 +377,6 @@ void Transmitter::transmitViaDma(WaveReader &reader, uint32_t bufferSize, uint8_
volatile PWMRegisters *pwm = initPwmController();
double value;
uint32_t i, cbOffset = 0;
#ifndef NO_PREEMP
PreEmphasis preEmphasis(sampleRate);
@ -387,7 +386,7 @@ void Transmitter::transmitViaDma(WaveReader &reader, uint32_t bufferSize, uint8_
volatile uint32_t *clkDiv = reinterpret_cast<uint32_t *>(reinterpret_cast<uint32_t>(dmaCb) + 2 * sizeof(DMAControllBlock) * bufferSize);
volatile uint32_t *pwmFifoData = reinterpret_cast<uint32_t *>(reinterpret_cast<uint32_t>(clkDiv) + sizeof(uint32_t) * bufferSize);
for (i = 0; i < bufferSize; i++) {
value = samples[i].getMonoValue();
float value = samples[i].getMonoValue();
#ifndef NO_PREEMP
value = preEmphasis.filter(value);
#endif
@ -424,7 +423,7 @@ void Transmitter::transmitViaDma(WaveReader &reader, uint32_t bufferSize, uint8_
cbOffset = 0;
eof = samples.size() < bufferSize;
for (i = 0; i < samples.size(); i++) {
value = samples[i].getMonoValue();
float value = samples[i].getMonoValue();
#ifndef NO_PREEMP
value = preEmphasis.filter(value);
#endif
@ -489,7 +488,7 @@ void Transmitter::transmitThread()
break;
}
uint32_t prevOffset = offset;
double value = samples[offset].getMonoValue();
float value = samples[offset].getMonoValue();
#ifndef NO_PREEMP
value = preEmphasis.filter(value);
#endif

Wyświetl plik

@ -49,13 +49,13 @@ class Transmitter
Transmitter(const Transmitter &source) = delete;
Transmitter &operator=(const Transmitter &source) = delete;
static Transmitter &getInstance();
void transmit(WaveReader &reader, double frequency, double bandwidth, uint8_t dmaChannel, bool preserveCarrierOnExit);
void transmit(WaveReader &reader, float frequency, float bandwidth, uint8_t dmaChannel, bool preserveCarrierOnExit);
void stop();
private:
Transmitter();
uint32_t getPeripheralsVirtBaseAddress();
uint32_t getPeripheralsSize();
double getSourceFreq();
float getSourceFreq();
uint32_t getPeripheralPhysAddress(volatile void *object);
static uint32_t getPeripheralVirtAddress(uint32_t offset);
uint32_t getMemoryPhysAddress(AllocatedMemory &memory, volatile void *object);