Domanda

((Risposta selezionata - vedi Modifica 5 di seguito.))

Devo scrivere un semplice generatore di rumore rosa in C #. Il problema è che non ho mai fatto alcun lavoro audio prima, quindi non so come interagire con la scheda audio, ecc. So che voglio stare lontano dall'uso di DirectX, soprattutto perché non voglio per scaricare un enorme SDK solo per questo piccolo progetto.

Quindi ho due problemi:

  1. Come si genera il rumore rosa?
  2. Come si esegue lo streaming sulla scheda audio?

Modifica : davvero voglio creare un generatore di rumore rosa ... Sono consapevole che ci sono altri modi per risolvere il problema di root. =)

Modifica 2 : il nostro firewall blocca lo streaming di audio e video, altrimenti andrei semplicemente su www .simplynoise.com come suggerito nei commenti. : (

Modifica 3 : ho ridotto la generazione del rumore bianco, oltre a inviare l'output alla scheda audio, ora tutto ciò che devo sapere è come trasformare il rumore bianco in rumore rosa. Oh - e non voglio eseguire il looping di un file wav perché ogni applicazione che ho provato a utilizzare per il looping termina con una piccola piccola interruzione tra i loop, che è abbastanza stonante da avermi spinto in questa direzione in primo luogo ...

Modifica 4 : ... Sono sorpreso che così tante persone siano passate in modo molto esplicito per non rispondere a una domanda. Probabilmente avrei ottenuto una risposta migliore se avessi mentito sul motivo per cui ho bisogno del rumore rosa ... Questa domanda è più su come generare e trasmettere dati sulla scheda audio piuttosto che sul tipo di cuffie che dovrei usare. A tal fine ho modificato i dettagli dello sfondo: puoi leggerlo nelle modifiche ...

Modifica 5 : ho selezionato di seguito la risposta di Paul perché il link che mi ha fornito mi ha dato la formula per convertire il rumore bianco (che è facilmente generato tramite il generatore di numeri casuali) in rumore rosa. Oltre a questo, ho usato la voce CodeProject di Ianier Munoz & Quot; Programmazione degli effetti audio in C # " per informazioni su come generare, modificare e trasmettere dati audio sulla scheda audio. Grazie ragazzi per il vostro aiuto. =)

È stato utile?

Soluzione

Forse puoi convertire il codice C / C ++ qui in C #:

http://www.firstpr.com.au/dsp/pink-noise /

Il modo più semplice per ottenere l'audio sulla scheda audio è generare un wav (sputare alcune intestazioni hardcoded e quindi campionare i dati). Quindi è possibile riprodurre il file .wav.

Altri suggerimenti

Il rumore rosa è solo il rumore bianco trasmesso attraverso un LPF di -3dB / ottava. Puoi generare rumore bianco usando rand () (o qualsiasi funzione che generi numeri casuali in modo uniforme).

Lo streaming di cose sulla scheda audio è ragionevolmente banale, a patto che tu abbia Google a portata di mano. Se scegli di evitare DirectX, considera l'utilizzo di PortAudio o ASIO per l'interfacciamento con la scheda audio ... anche se penso che dovrai usare C ++ o C.

A parte questo, perché perdere tempo CPU generandolo? Ripeti un dannato file WAV!

me ne rendo conto un po 'tardi, ma chiunque si imbatta in una risposta dovrebbe sapere che il rumore rosa è rumore bianco con -3dB / ottava, non -6 come indicato sopra, che in realtà è rumore marrone.

Non è proprio una risposta alla tua domanda, ma non puoi semplicemente ascoltare un po 'di musica, idealmente con delle cuffie con cancellazione del rumore?

Ecco un esempio di come appare il thread di riproduzione. Sto usando DirectSound per creare un SecondaryBuffer in cui sono scritti i campioni. Come puoi vedere è abbastanza semplice:

    /// <summary>
    /// Thread in charge of feeding the playback buffer.
    /// </summary>
    private void playbackThreadFn()
    {
        // Begin playing the sound buffer.
        m_playbackBuffer.Play( 0, BufferPlayFlags.Looping );

        // Change playing state.
        IsPlaying = true;

        // Playback loop.
        while( IsPlaying )
        {
            // Suspend thread until the playback cursor steps into a trap...
            m_trapEvent.WaitOne();

            // ...read audio from the input stream... (In this case from your pink noise buffer)
            Input.Collect( m_target, m_target.Length );

            // ...calculate the next writing position...
            var writePosition = m_traps[ ((1 & m_pullCounter++) != 0) ? 0 : 1 ].Offset;

            // ...and copy audio to the device buffer.
            m_playbackBuffer.Write( writePosition, m_deviceBuffer, LockFlag.None );
        }

        // Stop playback.
        m_playbackBuffer.Stop();
    }

Se hai bisogno di maggiori dettagli su come funziona, sarò felice di aiutarti.

Come un modo rapido e sporco per farlo, che ne dici di fare semplicemente un loop di un rumore rosa nel tuo lettore audio? (Sì, so che parte del divertimento è farlo da soli ....)

Che dire di un campione .mp3 di Pink Noise su ripetizione?

Puoi utilizzare Audacity per generare tutto il rumore rosa che desideri, quindi ripeterlo.

/ p>

Oppure potresti scavare nel codice sorgente e vedere come Audacity fa la generazione del rumore rosa.

Ecco un modo molto semplice per creare rumore rosa, che somma insieme molte onde distanziate logaritmicamente, insieme! Potrebbe essere troppo lento per i tuoi scopi se desideri che il suono venga creato in tempo reale, ma è sicuramente possibile un'ulteriore ottimizzazione (ad esempio: una funzione coseno più veloce).

Le funzioni generano un doppio array con valori compresi tra -1 e 1. Ciò rappresenta rispettivamente i punti più bassi e più alti nella forma d'onda.

Il parametro quality rappresenta il numero di onde prodotte per produrre il suono. Trovo che 5000 onde (circa 40 intervalli per semitono) siano quasi la soglia in cui non riesco a rilevare alcun miglioramento evidente con valori più alti, ma per essere al sicuro, potresti (facoltativamente) aumentarlo a circa 10.000 onde o più . Inoltre, secondo Wikipedia, 20 hertz è intorno al limite inferiore della percezione umana in termini di ciò che possiamo ascoltare, ma puoi cambiarlo anche se vuoi.

Nota che il suono diventa più basso con un valore volumeAdjust più alto per motivi tecnici, quindi potresti (facoltativamente) voler regolare il volume tramite il parametro <=>.

public double[] createPinkNoise(double seconds, int quality=5000, double lowestFrequency=20, double highestFrequency = 44100, double volumeAdjust=1.0)
{
    long samples = (long)(44100 * seconds);
    double[] d = new double[samples];
    double[] offsets = new double[samples];
    double lowestWavelength = highestFrequency / lowestFrequency;
    Random r = new Random();
    for (int j = 0; j < quality; j++)
    {
        double wavelength = Math.Pow(lowestWavelength, (j * 1.0) / quality)  * 44100 / highestFrequency;
        double offset = r.NextDouble() * Math.PI*2;     // Important offset is needed, as otherwise all the waves will be almost in phase, and this will ruin the effect!
        for (int i = 0; i < samples; i++)
        {
            d[i] += Math.Cos(i * Math.PI * 2 / wavelength + offset) / quality * volumeAdjust;
        }
    }
    return d;
}

Non posso parlare di C #, ma potresti stare meglio con delle buone cuffie con cancellazione del rumore e i tuoi mp3 preferiti.

Se sei su Linux, puoi usare SOX (potresti già averlo, prova il comando play).

play -t sl - synth 3 pinknoise band -n 1200 200 tremolo .1 40 < /dev/zero

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top