- no channel sum for last diffusion step
- elimnated latency due to feedback delay
- added print for channel shuffle and delay values
This commit is contained in:
2025-11-13 17:50:36 +01:00
parent 6348a4db71
commit 910170e8dc
+39 -8
View File
@@ -6,6 +6,7 @@
#include <common/mix.hpp> #include <common/mix.hpp>
#include <initializer_list> #include <initializer_list>
#include <sys/types.h> #include <sys/types.h>
#include <iostream>
template<typename T, size_t numCh> template<typename T, size_t numCh>
class Delay class Delay
@@ -14,6 +15,15 @@ class Delay
int m_delay_spec[numCh]; int m_delay_spec[numCh];
uint m_delaySize; uint m_delaySize;
void print_delays()
{
std::cout << "delays" << std::endl;
for (int i=0; i < numCh; i++)
{
std::cout << m_delay_spec[i] << " ";
}
std::cout << std::endl;
}
public: public:
Delay(uint delayCapacity, int delayOffset) Delay(uint delayCapacity, int delayOffset)
: m_buf(delayCapacity) : m_buf(delayCapacity)
@@ -40,6 +50,7 @@ class Delay
m_delay_spec[i] = -delay; m_delay_spec[i] = -delay;
} }
m_delaySize = delaySize; m_delaySize = delaySize;
print_delays();
} }
uint getDelay() uint getDelay()
@@ -75,9 +86,17 @@ class Diffusor
Delay<T, numCh> m_dly; Delay<T, numCh> m_dly;
int m_shuffle_spec[numCh]; int m_shuffle_spec[numCh];
public: void print_shuffle()
Diffusor(uint maxDelaySize) {
: m_dly(maxDelaySize, 0) std::cout << "shuffle" << std::endl;
for (int i=0; i < numCh; i++)
{
std::cout << m_shuffle_spec[i] << " ";
}
std::cout << std::endl;
}
void shuffle_init(double pn)
{ {
// Shuffle spec // Shuffle spec
for (int i=0; i < numCh; i++) for (int i=0; i < numCh; i++)
@@ -96,15 +115,22 @@ class Diffusor
} }
// Shuffle signs // Shuffle signs
float p = 0.3;
for (int i=0; i < numCh; i++) for (int i=0; i < numCh; i++)
{ {
float z = (float)rand()/(float)RAND_MAX; double z = (double)rand()/(double)RAND_MAX;
if (z <= p) if (z < pn)
{ {
m_shuffle_spec[i] *= (T)-1; m_shuffle_spec[i] *= (T)-1;
} }
} }
print_shuffle();
}
public:
Diffusor(uint maxDelaySize, double pn=0.5)
: m_dly(maxDelaySize, 0)
{
shuffle_init(pn);
} }
void setDelay(uint delay) void setDelay(uint delay)
@@ -141,7 +167,7 @@ class Diffusor
// Out-of-place // Out-of-place
inline void process_multi(T in[numCh], T out[numCh]) inline void process_multi(T in[numCh], T out[numCh])
{ {
m_dly.process(in); m_dly.process(in, out);
Shuffle<T, numCh>::outOfPlace(in, out, m_shuffle_spec); Shuffle<T, numCh>::outOfPlace(in, out, m_shuffle_spec);
Hadamard<T, numCh>::inPlace(out); Hadamard<T, numCh>::inPlace(out);
@@ -168,6 +194,11 @@ class Reverb
} }
} }
uint getNumDiffusionSteps()
{
return m_diffusors.size();
}
void setDelay(uint delay, uint index) void setDelay(uint delay, uint index)
{ {
m_diffusors[index].setDelay(delay); m_diffusors[index].setDelay(delay);
@@ -215,7 +246,7 @@ class Reverb
// Mix // Mix
for (int c=0; c < numCh; c++) for (int c=0; c < numCh; c++)
{ {
out[i] += fb_dly_out[c]; out[i] = temp[0];
} }
} }
} }