Как я могу создать генератор розового шума?

StackOverflow https://stackoverflow.com/questions/616897

  •  03-07-2019
  •  | 
  •  

Вопрос

((Выбран ответ - см. правку 5 ниже.))

Мне нужно написать простой генератор розового шума на C #.Проблема в том, что я никогда раньше не работал со звуком, поэтому не знаю, как взаимодействовать со звуковой картой и т.д.Я точно знаю, что хочу держаться подальше от использования DirectX, в основном потому, что я не хочу загружать огромный SDK только для этого крошечного проекта.

Итак, у меня есть две проблемы:

  1. Как мне генерировать Розовый шум?
  2. Как мне передать его на звуковую карту?

Редактироватьв самом деле хочу сделать генератор розового шума...Я знаю, что есть другие способы решить основную проблему.=)

Правка 2:Наш брандмауэр блокирует потоковое аудио и видео - в противном случае я бы просто перешел на www.simplynoise.com как было предложено в комментариях.:(

Правка 3:Я отключил генерацию белого шума, а также отправку выходных данных на звуковую карту - теперь все, что мне нужно знать, это как превратить белый шум в розовый.О, и я не хочу зацикливать wav-файл, потому что каждое приложение, которое я пытался использовать для зацикливания, заканчивается крошечным перерывом между циклами, что достаточно раздражает, чтобы изначально подтолкнуть меня в этом направлении...

Правка 4:...Я удивлен, что так много людей очень недвусмысленно отреагировали на это нет ответьте на вопрос.Вероятно, я получил бы лучший ответ, если бы солгал о том, зачем мне нужен розовый шум...Этот вопрос больше касается того, как генерировать и передавать данные на звуковую карту, чем того, какие наушники мне следует использовать.С этой целью я отредактировал предысторию - вы можете прочитать об этом в разделе правок...

Правка 5:Я выбрал ответ Пола ниже, потому что ссылка, которую он предоставил, дала мне формулу для преобразования белого шума (который легко генерируется с помощью генератора случайных чисел) в розовый шум.В дополнение к этому я использовал Запись в CodeProject Яньера Муньоса "Программирование звуковых эффектов на C #" чтобы узнать, как генерировать, изменять и выводить звуковые данные на звуковую карту.Спасибо вам, ребята, за вашу помощь.=)

Это было полезно?

Решение

Может быть, вы можете преобразовать код C / C ++ здесь в C #:

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

Самый простой способ получить звук на звуковую карту - это сгенерировать wav (выложить несколько жестко закодированных заголовков и затем сэмплировать данные). Затем вы можете воспроизвести файл .wav.

Другие советы

Розовый шум - это просто белый шум, подаваемый через LPF -3 дБ / октаву. Вы можете генерировать белый шум, используя rand () (или любую функцию, которая генерирует равномерно случайные числа).

Потоковое вещание на звуковую карту достаточно тривиально, если у вас есть Google. Если вы решите избегать DirectX, рассмотрите возможность использования PortAudio или ASIO для взаимодействия со звуковой картой ... хотя я думаю, что вам придется использовать C ++ или C.

Кроме этого, зачем тратить время процессора на его создание? Зациклить чертов WAV-файл!

Я понял, что немного опоздал, но любой, кто сталкивается с вопросами, должен знать, что розовый шум - это белый шум с -3 дБ / октава, а не с -6, как указано выше, что на самом деле является коричневым шумом.

Не совсем ответ на ваш вопрос, но вы не можете просто послушать музыку, в идеале, с наушниками с шумоподавлением?

Вот пример того, как выглядит поток воспроизведения. Я использую DirectSound для создания SecondaryBuffer, где записаны примеры. Как вы можете видеть, это довольно просто:

    /// <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();
    }

Если вам нужны подробности о том, как это работает, я буду рад помочь.

Как быстрый и грязный способ сделать это, как насчет просто зацикливания розового шума WAV в вашем аудиоплеере? (Да, я знаю, что самое интересное в том, чтобы сделать это самостоятельно ....)

Как насчет образца .mp3 Pink Noise при повторении?

Вы можете использовать Audacity , чтобы генерировать столько розового шума, сколько хотите, а затем повторить его.

Или вы можете покопаться в исходном коде и посмотреть, как Audacity генерирует розовый шум.

Вот очень простой способ создания розового шума, который просто суммирует множество волн, разнесенных логарифмически, вместе! Это может быть слишком медленным для ваших целей, если вы хотите, чтобы звук создавался в реальном времени, но дальнейшая оптимизация, безусловно, возможна (например, более быстрая функция косинуса).

Функции выводят двойной массив со значениями от -1 до 1. Это представляет самую низкую и самую высокую точки в форме волны соответственно.

Параметр quality представляет количество волн, создаваемых для создания звука. Я считаю, что 5000 волн (около 40 интервалов на полутон) - это почти порог, когда я не могу обнаружить заметных улучшений с более высокими значениями, но чтобы быть в безопасности, вы могли бы (необязательно) увеличить это примерно до 10000 волн или выше , Кроме того, согласно Википедии, 20 герц - это нижний предел человеческого восприятия с точки зрения того, что мы можем слышать, но вы также можете изменить это, если хотите.

Обратите внимание, что звук становится тише с более высоким значением volumeAdjust по техническим причинам, поэтому вы можете (необязательно) настроить громкость с помощью параметра <=>.

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;
}

Я не могу говорить о C #, но вам, возможно, будет лучше с некоторыми хорошими наушниками с шумоподавлением и вашими любимыми mp3.

Если вы используете Linux, вы можете использовать SOX (возможно, он у вас уже есть, попробуйте play команда).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top