Jeffrey A Voigt Ответов: 1

Мой звуковой буфер directx имеет статический шум. Пожалуйста помочь.


Поэтому мне нравится работать над заданиями в колледже (чтобы сохранить некоторые из моих навыков острыми), и я решил заняться этим:

Назначение программирования COS 126: назначение цифровой обработки сигналов[^]

Я запускаю приложение MSVS2015 C# / Console вместе с пакетом SharpDX, который дает мне доступ к некоторым базовым возможностям DirectSound. Я просто пытаюсь создать и сыграть 2-секундную ноту "а", как они идут в первом примере. Когда я запускаю следующий код, он воспроизводит 2 секунды,но он очень статичен. Я предполагаю, что что-то не так с моими расчетами, но я не могу понять, что именно. Есть ли у кого-нибудь опыт написания собственных цифровых звуковых буферов?

Спасибо,
- Джефф

Что я уже пробовал:

public class Execution : IDisposable
{
	IntPtr Handle;
	DirectSound Device;
	SecondarySoundBuffer Buffer;

	public Execution()
	{
		Handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;

		Device = new DirectSound();
		Device.SetCooperativeLevel(Handle, CooperativeLevel.Priority);

		var rate = 44100;
		var bits = 16;
		var channels = 1;
		var waveFormat = new WaveFormat(rate, bits, channels);

		// Create a buffer with 2 seconds of sample data
		var seconds = 2;

		var bufferDescription = new SoundBufferDescription() { Format = waveFormat, BufferBytes = waveFormat.AverageBytesPerSecond * seconds };
		Buffer = new SecondarySoundBuffer(Device, bufferDescription);

		var noteFrequency = 440f;       // A
		var bufferData = new float[bufferDescription.BufferBytes];

		var count = 0;
		for (var sample = 0; sample < bufferDescription.BufferBytes; sample++)
		{
			var sampleInSeconds = (float)sample / (float)bufferDescription.BufferBytes * (float)seconds;
			var value = (float)Math.Sin(2f * Math.PI * noteFrequency * sampleInSeconds );
			bufferData[sample] = value;
		}

		Buffer.Write(bufferData, 0, LockFlags.EntireBuffer);
	}

	public void Execute()
	{
		Buffer.Play(0, 0);
	}

	public void Dispose()
	{
		Buffer.Dispose();
		Device.Dispose();
	}
}

1 Ответов

Рейтинг:
2

Philippe Mori

Ну, я бы подумал, что вы пишете данные в неправильном формате. Типичный 16-битный волновой файл использует целые числа, а не плавающие точки.

Также, очевидно float это 32-битный файл, поэтому он не может быть подходящими данными для 16-битного волнового файла.

Учитывая, что и ширина, и тип данных отличаются от ожидаемых, как вы ожидаете получить хороший результат?

Хорошей отправной точкой было бы начать с анализа волнового файла, содержащего такую форму волны, и сравнить данные с вашими данными. Не должно быть трудно найти ни приложение, ни код для генерации волны.

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