白噪声、粉噪声低算力实现方案
【代码】白噪声、粉噪声低算力实现方案。
·
#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);
更多推荐


所有评论(0)