Подтвердить что ты не робот

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

((Ответ выбран - см. Редактировать 5 ниже.))

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

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

  • Как мне создать розовый шум?
  • Как мне передать его на звуковую карту?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Вот пример того, как выглядит поток воспроизведения. Я использую 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();
    }

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

Ответ 6

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

Ответ 7

Как насчет того, чтобы повторить образец .mp3 "Розовый шум"?

Ответ 8

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

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

Ответ 9

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

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

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

Обратите внимание, что звук становится тише с более высоким значением quality по техническим причинам, поэтому вы можете (необязательно) настроить громкость с помощью параметра 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;
}

Ответ 10

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

Ответ 11

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

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