Skip to content

Commit 812e2cd

Browse files
committed
Reduce the number of multiplications
1 parent aab5b03 commit 812e2cd

4 files changed

Lines changed: 27 additions & 15 deletions

File tree

src/Robocode/Channel.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ Channel::Channel(const size_t index, const size_t dftsize, const double samplera
1717
config.samplerate = samplerate;
1818
config.concertpitch = concertpitch;
1919

20-
config.phase.resize(dftsize);
20+
config.chnfreqs.resize(dftsize);
21+
config.chnphase.resize(dftsize);
22+
23+
for (size_t i = 0; i < dftsize; ++i)
24+
{
25+
config.chnfreqs[i] = hz * i;
26+
}
2127
}
2228

2329
Channel::Channel(const Channel& other) :
@@ -52,20 +58,20 @@ double Channel::synthesize(const std::span<std::complex<double>> dft,
5258
{
5359
assert_true(dft.size() == config.dftsize, "Invalid DFT size!");
5460

55-
const double tophase = (2 * std::numbers::pi) / config.samplerate;
61+
const double freq2phase = (2 * std::numbers::pi) / config.samplerate;
5662

57-
const double freq = config.freq;
5863
const double gain = config.gain;
5964

60-
auto& phase = config.phase;
65+
const auto& chnfreqs = config.chnfreqs;
66+
auto& chnphase = config.chnphase;
6167

6268
for (size_t i = 1; i < dft.size() - 1; ++i)
6369
{
64-
const double chnfreq = freq * i;
65-
const double pvcfreq = pvcfreqs[i] / dftfreqs[i];
70+
const double chnfreq = chnfreqs[i];
71+
const double pvcfreq = pvcfreqs[i];
6672
const double newfreq = chnfreq * pvcfreq;
6773

68-
phase[i] += newfreq * tophase;
74+
chnphase[i] += newfreq * freq2phase;
6975

7076
if (newfreq <= dftfreqs.front())
7177
{
@@ -77,7 +83,7 @@ double Channel::synthesize(const std::span<std::complex<double>> dft,
7783
continue;
7884
}
7985

80-
dft[i] += std::polar(gain, phase[i]);
86+
dft[i] += std::polar(gain, chnphase[i]);
8187
}
8288

8389
return gain;

src/Robocode/Channel.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class Channel final
3333
double samplerate;
3434
double concertpitch;
3535

36-
std::vector<double> phase;
36+
std::vector<double> chnfreqs;
37+
std::vector<double> chnphase;
3738
}
3839
config;
3940

src/Robocode/Vocoder.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,30 @@ inline double angle(const std::complex<double>& z)
1212
}
1313

1414
Vocoder::Vocoder(const double samplerate, const std::vector<double>& frequencies) :
15-
samplerate(samplerate),
1615
dftsize(frequencies.size())
1716
{
1817
cache.resize(dftsize);
18+
slope.resize(dftsize);
1919
freqs.resize(dftsize);
20+
21+
const double phase2freq = samplerate / (2 * std::numbers::pi);
22+
23+
for (size_t i = 0; i < dftsize; ++i)
24+
{
25+
slope[i] = phase2freq / frequencies[i];
26+
}
2027
}
2128

2229
void Vocoder::analyze(const std::span<const std::complex<double>> dft,
2330
const std::function<void(const std::span<const double> pvcfreqs)> callback)
2431
{
2532
assert_true(dft.size() == dftsize, "Invalid DFT size!");
2633

27-
const double tofreq = samplerate / (2 * std::numbers::pi);
28-
2934
for (size_t i = 0; i < dft.size(); ++i)
3035
{
31-
const double phase = angle(dft[i] / cache[i]); // TODO: approx, wrap
36+
const double phase = angle(dft[i] / cache[i]); // TODO: wrap
3237

33-
freqs[i] = phase * tofreq;
38+
freqs[i] = phase * slope[i];
3439
cache[i] = dft[i];
3540
}
3641

src/Robocode/Vocoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ class Vocoder final
1414

1515
private:
1616

17-
const double samplerate;
1817
const size_t dftsize;
1918

2019
std::vector<std::complex<double>> cache;
20+
std::vector<double> slope;
2121
std::vector<double> freqs;
2222

2323
};

0 commit comments

Comments
 (0)