C# WPF를 사용하여 실시간 FFT를 만들고 있습니다.오디오 재생을 지연하여 FFT와 동기화하는 방법
저는 NAudio의 WaveIn과 BufferedWaveProvider를 사용하여 Stereo Mix로 녹음 된 사운드를 캡처하고 있습니다. 필자는 초당 여러 번 버퍼의 FFT를 사용하여 비트 맵을 사용하여 디스플레이하여 스피커를 통해 재생되는 오디오의 실시간 푸리에 변환을 보여줍니다.
내 문제는 예상대로 표시된 FFT가 스피커에서 나오는 오디오보다 약간 뒤떨어져있는 것입니다 (아마도 200 밀리 초).
스피커에서 재생할 현재 오디오를 녹음 할 수있는 방법이 있습니까? 그렇기 때문에 FFT를 수행 한 다음 나중에 작은 시간 (예 : 200ms) 재생할 수 있습니다. 원래의 실시간 오디오를 음소거합니다.
최종 결과는 단순히 표시된 FFT에서 감지 된 지연을 효과적으로 제거하는 것입니다. 예를 들어, YouTube 비디오의 오디오는 프로그램이 실행되는 동안 비디오 뒤에서 약간 뒤떨어집니다. 여기
내가 지금 무슨에서 관련 방법은 다음과 같습니다public MainWindow()
{
sampleSize = (int)Math.Pow(2, 13);
BUFFERSIZE = sampleSize * 2;
InitializeComponent();
// get the WaveIn class started
WaveIn wi = new WaveIn();
wi.DeviceNumber = deviceNo;
wi.WaveFormat = new NAudio.Wave.WaveFormat(RATE, WaveIn.GetCapabilities(wi.DeviceNumber).Channels);
// create a wave buffer and start the recording
wi.DataAvailable += new EventHandler<WaveInEventArgs>(wi_DataAvailable);
bwp = new BufferedWaveProvider(wi.WaveFormat);
bwp.BufferLength = BUFFERSIZE; //each sample is 2 bytes
bwp.DiscardOnBufferOverflow = true;
wi.StartRecording();
}
public void UpdateFFT()
{
// read the bytes from the stream
byte[] buffer = new byte[BUFFERSIZE];
bwp.Read(buffer, 0, BUFFERSIZE);
if (buffer[BUFFERSIZE - 2] == 0) return;
Int32[] vals = new Int32[sampleSize];
Ys = new double[sampleSize];
for (int i = 0; i < vals.Length; i++)
{
// bit shift the byte buffer into the right variable format
byte hByte = buffer[i * 2 + 1];
byte lByte = buffer[i * 2 + 0];
vals[i] = (short)((hByte << 8) | lByte);
Ys[i] = vals[i];
}
FFT(Ys);
}
나는 오디오 프로세싱에 새로운 여전히 오전 - 어떤 도움을 주시면 감사하겠습니다.
WriteableBitmap을 사용하고 있습니까? – Clemens
@Clemens 예, 필자는 WriteableBitmapEx 패키지를 설치했습니다. –