Einfacher Sinus-Generator für .NET

In diesem Artikel möchte ich zeigen, wie man einen einfachen Sinus-Generator in .NET erstellen kann.

Zunächst ein Quelltextausschnitt, danach erkläre ich, was es damit aufsich hat:

const double frequency	= 1000;
const double amplitude	= 20000;
const long sampleRate	= 44100;
const int durationSec	= 5;

long sampleCount = sampleRate * durationSec;

double timeStep = 1.0 / (double)sampleRate;

double time = 0;
int[] values = new int[sampleCount];
for (long i = 0; i < sampleCount; i++) {
	values[i] = (int)(amplitude * Math.Sin(2 * Math.PI * frequency * time));
	time = time + timeStep;
}

Gut, nun also ein paar Erklärungen:

  • Zeilen 1-4: Einige Konstanten, die geändert werden können, um z. B. die Frequenz anzupassen.
    Hinweis: Die Frequenz kann maximal die Hälfte der Abtastrate betragen.
  • Zeile 6: Berechnung der Anzahl an Abtastpunkten.
  • Zeile 8: Berechnung der Zeit zwischen zwei Abtastpunkten.
  • Zeilen 10-11: Ein paar Variablen-Initialisierungen.
  • Zeilen 12-15: Hier wird schlussendlich der Wert für jeden Abtastpunkt berechnet.

Und nun noch der entsprechende Quelltext für Visual Basic .NET:

const frequency as double		= 1000
const amplitude as double		= 20000
const sampleRate As Long		= 44100
const durationSec As Integer	= 5

Dim sampleCount As Long
sampleCount = sampleRate * durationSec

Dim timeStep As Double
timeStep = 1.0 / sampleRate

Dim time As Double = 0
Dim values(0 To sampleCount - 1) As Integer
For i As Long = 0 To sampleCount - 1
	values(i) = amplitude * Math.Sin(2 * Math.PI * frequency * time)
	time = time + timeStep
Next i

Um das Ganze abzuspielen, kann man nun entweden einen API-Aufruf wie PlaySound (von winmm.dll) oder die Lösung dieses super Artikels (Englisch) verwenden.

Haben Sie auch bereits einmal einen Sinus in .NET generieren müssen?

Der Artikel ist auch in English verfügbar.

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>