37 void process(
float* out, uint16_t frames) {
38 for (uint16_t i = 0; i < frames; ++i) {
39 float white = next_white();
42 out[i] = pink_filter(white) * amplitude_;
44 out[i] = white * amplitude_;
50 void seed(uint32_t s) { lfsr_ = s ? s : 1; }
54 float amplitude_ = 1.0f;
57 uint32_t lfsr_ = 0x12345678u;
60 float b0_ = 0, b1_ = 0, b2_ = 0, b3_ = 0, b4_ = 0, b5_ = 0, b6_ = 0;
64 uint32_t lsb = lfsr_ & 1u;
66 if (lsb) lfsr_ ^= 0xD0000001u;
68 return (
static_cast<float>(lfsr_) / 2147483648.0f) - 1.0f;
71 float pink_filter(
float white) {
74 b0_ = 0.99886f * b0_ + white * 0.0555179f;
75 b1_ = 0.99332f * b1_ + white * 0.0750759f;
76 b2_ = 0.96900f * b2_ + white * 0.1538520f;
77 b3_ = 0.86650f * b3_ + white * 0.3104856f;
78 b4_ = 0.55000f * b4_ + white * 0.5329522f;
79 b5_ = -0.7616f * b5_ + white * 0.0168980f;
80 float pink = b0_ + b1_ + b2_ + b3_ + b4_ + b5_ + b6_ + white * 0.5362f;
81 b6_ = white * 0.115926f;
85 if (pink > 1.0f) pink = 1.0f;
86 if (pink < -1.0f) pink = -1.0f;