#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include "noise_generator.h"
// g_gain ---- (0,1]
void whitenoise_init(WhiteNoise_t *white_t, float g_gain)
{
	white_t->scale = g_gain * 2.0f / 0xffffffff;
#if 1
	white_t->g_x1 = 0x67452301;
	white_t->g_x2 = 0xefcdab89;
#else
	white_t->g_x1 = 0x70f4f854;
	white_t->g_x2 = 0xe1e9f0a7;
#endif
}
void pinknoise_init(PinkNoise_t *pink_t, float g_gain)
{
	whitenoise_init(&pink_t->whitenoise, g_gain);
	pink_t->b0 = 0;
	pink_t->b1 = 0;
	pink_t->b2 = 0;
}
void get_whitenoise(WhiteNoise_t *white_t, float *sample, uint32_t n_sample)
{

	while (n_sample--)
	{
		white_t->g_x1 ^= white_t->g_x2;
		*sample++ = (float)white_t->g_x2 * white_t->scale;
		white_t->g_x2 += white_t->g_x1;
	}
}

// Voss-McCartney
// Gardner  3order calc
// see  https://www.firstpr.com.au/dsp/pink-noise/
#if 0
b0 = 0.99886 * b0 + white * 0.0555179;
b1 = 0.99332 * b1 + white * 0.0750759;
b2 = 0.96900 * b2 + white * 0.1538520;
b3 = 0.86650 * b3 + white * 0.3104856;
b4 = 0.55000 * b4 + white * 0.5329522;
b5 = -0.7616 * b5 - white * 0.0168980;
pink = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;
b6 = white * 0.115926;
#endif
void get_pinknoise(PinkNoise_t *pink_t, float *sample, uint32_t n_sample)
{
	float tmp;
	WhiteNoise_t *m_white = &pink_t->whitenoise;
	while (n_sample--)
	{
		m_white->g_x1 ^= m_white->g_x2;
		tmp = m_white->g_x2 * m_white->scale;
		m_white->g_x2 += m_white->g_x1;
		// pink filter 3order opm
#if 0
		pink_t->b0 = 0.99765f * pink_t->b0 + tmp * 0.0990460f;
		pink_t->b1 = 0.96300f * pink_t->b1 + tmp * 0.2965164f;
		pink_t->b2 = 0.57000f * pink_t->b2 + tmp * 1.0526913f;
		*sample++ = (pink_t->b0 + pink_t->b1 + pink_t->b2 + tmp * 0.1848f);
#else
		pink_t->b0 = 0.99765f * pink_t->b0 + tmp * 0.0198092f;
		pink_t->b1 = 0.96300f * pink_t->b1 + tmp * 0.0593033f;
		pink_t->b2 = 0.57000f * pink_t->b2 + tmp * 0.2105383f;
		*sample++ = (pink_t->b0 + pink_t->b1 + pink_t->b2 + tmp * 0.03696f);
#endif
	}
}
#include <stdint.h>
typedef struct {
	float scale;
	int32_t g_x1;
	int32_t g_x2;
}WhiteNoise_t;

typedef struct {
	WhiteNoise_t whitenoise;
	float b0;
	float b1;
	float b2;
}PinkNoise_t;
void whitenoise_init(WhiteNoise_t *white_t, float g_gain);
void pinknoise_init(PinkNoise_t *pink_t, float g_gain);
void get_whitenoise(WhiteNoise_t *white_t, float *sample, uint32_t n_sample);
void get_pinknoise(PinkNoise_t *pink_t, float *sample, uint32_t n_sample);

更多推荐