34 lines
1.1 KiB
C#
34 lines
1.1 KiB
C#
using System;
|
|
|
|
namespace FluidSim.Core
|
|
{
|
|
public class SoundProcessor
|
|
{
|
|
private readonly float dt;
|
|
private readonly float scaleFactor; // 1 / (4π r)
|
|
private float flowLP, prevMassFlowOut, smoothDMdt;
|
|
private readonly float lpAlpha, alpha;
|
|
|
|
public float Gain = 1f;
|
|
|
|
public SoundProcessor(int sampleRate, float listenerDistance = 1f)
|
|
{
|
|
dt = 1f / sampleRate;
|
|
scaleFactor = 1f / (4f * MathF.PI * listenerDistance);
|
|
float tau = 0.02f;
|
|
alpha = MathF.Exp(-dt / tau);
|
|
float tauLP = 0.005f;
|
|
lpAlpha = MathF.Exp(-dt / tauLP);
|
|
}
|
|
|
|
public float Process(float massFlowOut)
|
|
{
|
|
flowLP = lpAlpha * flowLP + (1f - lpAlpha) * massFlowOut;
|
|
float rawDerivative = (flowLP - prevMassFlowOut) / dt;
|
|
prevMassFlowOut = flowLP;
|
|
smoothDMdt = alpha * smoothDMdt + (1f - alpha) * rawDerivative;
|
|
float pressure = smoothDMdt * scaleFactor * Gain;
|
|
return MathF.Tanh(pressure);
|
|
}
|
|
}
|
|
} |