문제

((답변 선택 - 아래 5 개 편집 참조)))))))

C#에 간단한 Pink Noise Generator를 작성해야합니다. 문제는 전에는 오디오 작업을 한 적이 없으므로 사운드 카드와 상호 작용하는 방법을 모르겠습니다. DirectX를 사용하지 않기를 원합니다. 이 작은 프로젝트를 위해 대규모 SDK를 다운로드합니다.

그래서 나는 두 가지 문제가 있습니다.

  1. 핑크 노이즈를 어떻게 생성합니까?
  2. 사운드 카드로 어떻게 스트리밍합니까?

편집하다: 나 진짜 분홍색 노이즈 생성기를 만들고 싶어요 ... 루트 문제를 해결하는 다른 방법이 있다는 것을 알고 있습니다. =))

편집 2: 우리의 방화벽 블록 스트리밍 오디오 및 비디오 - 그렇지 않으면 나는 그냥 갈 것입니다. www.simplynoise.com 의견에 제안 된 바와 같이. :(

편집 3: 나는 화이트 노이즈의 생성과 사운드 카드에 출력을 전송했습니다. 이제 알아야 할 것은 흰색 잡음을 분홍색 소음으로 바꾸는 방법 만 있습니다. 오 - 루핑에 사용하려고 시도한 모든 응용 프로그램이 루프 사이의 작은 휴식으로 끝나기 때문에 wav 파일을 루프하고 싶지 않습니다. ...

편집 4: ... 많은 사람들이 매우 명시 적으로 뛰어 들었다는 사실에 놀랐습니다. ~ 아니다 질문에 답하십시오. 분홍색 소음이 필요한 이유에 대해 거짓말을했다면 더 나은 응답을 얻었을 것입니다 ...이 질문은 어떤 종류의 헤드폰을 사용해야하는지보다 사운드 카드에 데이터를 생성하고 스트리밍하는 방법에 관한 것입니다. 이를 위해 배경 세부 정보를 편집했습니다. 편집에서 읽을 수 있습니다 ...

편집 5: 그가 제공 한 링크가 나에게 백색 노이즈 (임의 번호 생성기를 통해 쉽게 생성 될 수 있음)를 핑크 노이즈로 변환 할 수있는 공식을 제공했기 때문에 바울의 답변을 선택했습니다. 이 외에도 사용했습니다 Ianier Munoz의 CodeProject 항목 "C#의 오디오 효과 프로그래밍" 사운드 카드를 사운드 카드로 생성, 수정 및 출력하는 방법을 배우려면. 도와 주셔서 감사합니다. =))

도움이 되었습니까?

해결책

C/C ++ 코드를 여기에서 C#로 변환 할 수 있습니다.

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

사운드 카드에 사운드를 얻는 가장 쉬운 방법은 WAV를 생성하는 것입니다 (일부 하드 코드 헤더를 뱉어 내고 샘플 데이터). 그런 다음 .wav 파일을 재생할 수 있습니다.

다른 팁

핑크 노이즈는 -3dB/옥타브 LPF를 통한 화이트 노이즈입니다. rand () (또는 균일하게 랜덤 숫자를 생성하는 함수)를 사용하여 백색 노이즈를 생성 할 수 있습니다.

Google이 편리한 한 사운드 카드로 스트리밍하는 것은 합리적으로 사소합니다. DirectX를 피하기로 선택한 경우, 사운드 카드와 인터페이스를 위해 Portaudio 또는 ASIO를 사용하는 것을 고려하십시오 ... C ++ 또는 C를 사용해야한다고 생각합니다.

그 외에는 왜 CPU 시간을 낭비 하는가? 망할 wav 파일을 루프하십시오!

이것에 대해 조금 늦었지만, 답을 위해 그것을 만나는 사람은 누구나 분홍색 노이즈는 위에서 언급 한 바와 같이 -6이 아닌 -3db/옥타브의 흰색 노이즈라는 것을 알아야합니다. 이는 실제로 갈색 소음입니다.

실제로 귀하의 질문에 대한 답은 아니지만 소음 취소 헤드폰으로 이상적인 음악을들을 수 없습니까?

다음은 재생 스레드의 모습의 예입니다. 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();
    }

작동 방식에 대한 자세한 내용이 필요하다면 기꺼이 도와 드리겠습니다.

빠르고 더러운 방법으로 오디오 플레이어에서 분홍색 노이즈 웨이브를 반복하는 것은 어떻습니까? (예, 재미의 일부가 직접 만드는 것임을 알고 있습니다 ....)

반복시 분홍색 소음의 .mp3 샘플은 어떻습니까?

당신은 사용할 수 있습니다 대담 원하는만큼 분홍색 소음을 생성 한 다음 반복하십시오.

또는 소스 코드를 파고 Audacity가 분홍색 노이즈 생성 방식을 볼 수 있습니다.

다음은 분홍색 노이즈를 만드는 매우 간단한 방법이 있습니다. 실시간으로 사운드를 생성하려는 경우 목적에 비해 너무 느리지 만 추가 최적화가 가능합니다 (예 : 더 빠른 코사인 기능).

함수는 -1에서 1 사이의 값을 가진 이중 배열을 출력합니다. 이는 각각 파형에서 가장 낮고 가장 높은 점을 나타냅니다.

그만큼 quality 매개 변수는 소리를 만들기 위해 생성 된 파의 수를 나타냅니다. 5000 파 (세미 톤 당 약 40 간격)가 더 높은 값으로 눈에 띄는 개선을 감지 할 수없는 임계 값에 불과하지만 안전한 측면에 있으면 (선택적으로) 이것을 약 10,000 파 또는 더 높게 증가시킬 수 있습니다. . 또한 Wikipedia에 따르면 20 Hertz는 우리가들을 수있는 것과 관련하여 인간의 인식의 하한 주위에 있지만, 원한다면 이것을 바꿀 수 있습니다.

소리가 더 높아서 더 조용해집니다 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;
}

나는 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