Sinus wird nicht korrekt berechnet?
Hallo ich ein Problem mit der Phasenverschiebung wenn diese bei GenerateSignal als 0 oder kleiner als 10 übergeben wird ist der Graph ein Gerade allerdings wenn die Phase als Wert wie zum Beispiel 200 übergeben wird ist der Graph wieder normal als ob die Phase die Amplitude beeinflusst ich kann aber nicht herausfinden woran es liegt?
Mein Code dieser erbt zwar von einer Klasse allerdings ist das unwichtig sowie das Main-Window unwichtig ist weil es kommen wirklich richtige Werte (Habe auch schon ChatGPT dazu gezogen wie man am Code sehen kann.):using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows;
using System.Windows.Media;
namespace Generator
{
public class Sinus : Signal
{
public Sinus(int sampleRate) : base(sampleRate)
{
}
public double[] GenerateSignal(double amplitude, double frequency, double phase, int time)
{
int totalSamples = this.SampleRate * time;
double[] points = new double[totalSamples];
// Phase als Verschiebung der x-Achse: Keine Umrechnung nötig, da Phase schon als verschobene Zeit in Bogenmaß funktioniert.
for (int i = 0; i < totalSamples; ++i)
{
double t = (double)i / this.SampleRate; // Zeit in Sekunden
points[i] = amplitude * Math.Sin(2 * Math.PI * frequency * t + phase); // Phase wirkt sich nur auf die Verschiebung aus
}
return points;
}
public override void Draw(Canvas canvas, double[] points)
{
// Erstelle die Polyline
Polyline geometryFigure = new Polyline()
{
Name = “myPolyline”,
Stroke = Brushes.Black, // Linie sichtbar machen
StrokeThickness = 1, // Linienstärke
Fill = Brushes.Transparent
};
// Berechne den Mittelpunkt des Canvas
double canvasCenterY = canvas.ActualHeight / 2;
// Berechne die Amplitude der Sinuskurve
double amplitude = points.Max(); // Die maximale Amplitude der Sinusfunktion
double minAmplitude = points.Min(); // Der minimalste Wert der Sinuskurve
double amplitudeRange = amplitude – minAmplitude; // Gesamtbereich der Amplitude
// Berechne den Offset, um den Mittelpunkt der Sinuskurve auf den Mittelpunkt des Canvas zu verschieben
double offsetY = canvasCenterY;
// Erstelle die PointCollection mit den verschobenen Punkten
PointCollection pointCollection = new PointCollection();
for (int i = 0; i < points.Length; ++i)
{
// Verschiebe den Punkt so, dass der Mittelpunkt der Sinuskurve in die Mitte des Canvas verschoben wird
double x = i -500;
// Skalierung und Verschiebung
double y = points[i] + canvas.ActualHeight / 1.98;
// Punkte zur PointCollection hinzufügen
pointCollection.Add(new Point(x, y));
}
// Setze die Points für die Polyline
geometryFigure.Points = pointCollection;
// Füge die Polyline zum Canvas hinzu
canvas.Children.Add(geometryFigure);
}
}
}
See if Generate Signals generates the correct data and are passed on to Draw correctly on these values.