Verfasst am: 10.02.2016, 00:19
Titel: Abtastheorem an einem Sinussignal
Moin zusammen,
ich möchte gerne das Abtasttheorem an einer Sinuskurve erklären.
Dabei will ich mehrere Sinusfunktionen in Graphen plotten,an denen ich mit niedrigen bzw. hohen Frequenzen abtaste.
Dafür habe ich natürlich erstmal ein Sinussignal geplottet und ein bisschen mit der x-achse rumgespielt:
Code:
Fs = 8000;
dt = 1/Fs;
StopTime = 0.04;
t = (0:dt:StopTime)';
Fc = 100; % 100 hertz >> T=10ms
x = sin(2*pi*Fc*t);
figure;
plot(t,x);
xlabel('Zeit(in ms)');
title('Amp. vs. Zeit');
zoom xon;
grid on;
axis([0,0.04,-1.5,1.5]);
xenhancetick=0.005;
set(gca,'xtick',([min(xlim):xenhancetick:max(xlim)]));
set(gca,'XTick',[0:0.005:0.04]); %x-werte get set(gca,'XTickLabel',[0:5:40]); % x-werte set
Fragen:
Ist das überhaupt der richtige weg mit stem() sowas darzustellen?
Gibt es da eine andere plotfunktion oder etwas ähnliches?
Nachdem die Abtastpunkte im Graphen dargestellt sind, möchte ich diese Punkte
nutzen um eine Sinusfunktion zu generieren. Damit man sehen kann wie das neue abgetastete Signal vs. Eingangssignal steht.
Vielen Dank im Voraus!
P.S:
Ja, ich habe keine Ahnung was Matlab angeht, ist auch mein erster Versuch hiermit.
ich finde du hast das Programm sehr ausführlich und genau beschrieben und deklariert! Mittels
stem()
kann man dies sehr gut darstellen - weil es genau einer Abtastung entspricht in graphischer Hinsicht!
Deine Abtastfrequenz muss höher sein als die Frequenz des Ausgangssignals - in deinem Fall ist ja Fsa1 = Fc -> das führt dazu dass er genau die Werte nach einer Periode abtastet und diese respektive Null sind! Erhöhst du Fsa1 auf 1000, so wird dein Ausgangssinus 10 mal abgetastet - somit auch 10 stems bis zu einer Periode!
Und deine Variable xa1 verwendet bereits dieses abgetasteten Punkte für den Sinus - somit hast du die Lösung deiner Frage bereits!
danke für deine Antwort!
Das mit der Abtastfrequenz (Shannon lässt grüßen) ist mir schon klar. Es sind auch absichtlich 100 Hz im ersten Fall, damit man genau das darstellen kann was du auch beschreibst.
Wenn ich jetzt aber die Frequenz auf z.B 400 Hz erhöhe (beim 2ten Code oben), somit:
Code:
% (1)abtaspunkte für frequenz f=400 Hz darstellen hold on;
Fsa1= 400;
dta1=1/Fsa1;
StopTimea1=0.04;
ta1=(0:dta1:StopTimea1)';
xa1=sin(2*pi*Fc*ta1);
stem(ta1,xa1,'r');
Und anschließend über folgenden Code, die Abtastpunkte in einem Sinus darstellen will:
Code:
%(2) Abtastpunkte unter (1) in einem Sinus darstellen
hold on;
Fsa1p=8000;
dta1p=1/Fsa1p;
Fca1p=Fsa1;
StopTimea1p=0.04;
ta1p=(0:dta1p:StopTimea1p)';
xa1p=sin(2*pi*Fca1p*ta1p);
plot(ta1p,xa1p,'g');
Erhalte ich ja eine neue grüne Kurve die eine Frequenz von 400 Hz (was aufgrund des Codes unter (2) sinn macht). Ich möchte aber in dem Fall ein neu erzeugtes Sinussignal sehen, dass Aufgrund der erfüllten Shannon Bedingung genau das Eingangssignal darstellt. Bei Abtastfrequenz 50 Hz müsste ich den Aliasing Effekt sehen, da ich undersample, also in dem Fall ein Sinussignal mit deutlich größerer Periode usw. Ich hoffe, dass ich mich verständlich ausgedrückt habe!
So funktioniert meiner Meinung nach das Prinzip - ich denke du hast bei deinem Code die Frequenz des Signals mit der Abtastfrequenz vertauscht! Die Variable
freq
in meinem Fall muss gleich bleiben - ändern tut sich die Abtastrate dt bzw. dt1 und somit die erhaltenen Zeitwerte aus den Laufvariablen!
Lass mich wissen ob das dein Problem so löst! Du musst dich nur mit deinem Abtastraten spielen, sodass du einen guten Effekt erkennst!
ich habe mir dein Code angeguckt. Da kann man die Annäherung zum Eingangssignal, durch die Erhöhung der Abtastrate sehr gut erkennen. Trotzdem, will ich das ganze ein bisschen anders darstellen. Ich habe im vorhinein auch noch ein bisschen rumrecherchiert und bin zum Schluss gekommen, dass ich das was ich darstellen will eigentlich nur über eine stückweise Approximation (als interp1()) erreiche. Ich behalte die stem() Darstellung der Abtastpunkte bei, weil dies ja auch die Abtastpunkte sind.
Diese Punkte interpoliere ich einfach (die Punkte werden in einem plot verbunden und zeigen somit das Produkt aus einer falschen Abtastrate). Mit dem Spline kann man einiger maßen gut auch den Aliasing Effekt sehen (bei entsprechender Frequenz).
Code:
%Zeit specs.
Fs = 8000; % Anzahl der absoluten Abtastwerte
dt = 1/Fs; % Abtastzeitschritte
StopTime = 0.04; % Stopzeit - entspricht bei 100Hz vier Sinusschwingungen
t = (0:dt:StopTime)'; % Laufvariable
%Sinusschwingung
Fc = 100; % Frequenz eines Sinus-Signals 100 hertz >> T=10ms
x = sin(2*pi*Fc*t);
%normiere achsen
grid on;
axis([0,0.04,-1.5,1.5]);
xenhancetick=0.005;
set(gca,'xtick',([min(xlim):xenhancetick:max(xlim)])); %Auflösung auf der x-Achse vergrößern mit 0.005 Schritten zwischen aktueller limits xmin,xmax
set(gca,'XTick',[0:0.005:0.04]); %x-werte get, von sec. ,faktor 10^3 set(gca,'XTickLabel',[0:5:40]); %x-werte set, auf msec.,
%stelle durch stem() Abtastpunkte dar bei Fsa1= ca 80 Hz kann Aliasing gut dargestellt werden
hold on;
Fsa1= 80; %Diese Variieren und damit die Abtastpunkte verdeutlichen, zeitgleich über stückweise Aproximation (interp1 linear und spline) results sehen
dta1=1/Fsa1;
StopTimea1=0.04;
ta1=(0:dta1:StopTimea1)';
xa1=sin(2*pi*Fc*ta1);
stem(ta1,xa1,'r');
hold on;
%interpoliere die punkte der ausgangsfunktion xa1=sin(2*pi*Fc*ta1), zu den zeiten ta1 und stelle diese über range t dar
tp=ta1; %xpQuelle für interpl in dem Fall x-werte Abtastpunkte
yp=sin(2*pi*Fc*tp); %yp
xf=t;
lin=interp1(tp,yp,xf);
spline=interp1(tp,yp,xf,"spline");
plot(xf,lin,"g", xf,spline,"m");
hold off;
%fft figure(2);
freqDomain=fft(x);
stem(abs(freqDomain));
axis([-120,120,0,120]);
function[X,freq]=positiveFFT(x,Fs);
N=length(x);
k=0:N-1;
T=N/Fs;
freq=k/T;
X=fft(x)/N;
cutOff=ceil(N/2);
X=X(I:cutOff);
freq=freq(I:cutOff);
Jetzt wie du zum Schluss sehen kannst versuche ich über fft() in figure(2) meine Sinussignal von der zeitlichen Darstellung in die Frequenz Darstellung zu bringen. Damit wüsste ich als ahnungsloser untersuchender eines Eingangssignals, mit welcher Frequenz sich dieses Signal verändert und könnte entsprechend min. 2*fmax abtasten. In Figure(2) sollte eigentlich 100 Hz bei rauskommen, ich hab das aber mit dem fft und der Darstellung davon noch nicht so raus...
%normiere achsen
grid on;
axis([0,0.04,-1.5,1.5]);
xenhancetick=0.005;
set(gca,'xtick',([min(xlim):xenhancetick:max(xlim)])); %Auflösung auf der x-Achse vergrößern mit 0.005 Schritten zwischen aktueller limits xmin,xmax
set(gca,'XTick',[0:0.005:0.04]); %x-werte get, von sec. ,faktor 10^3 set(gca,'XTickLabel',[0:5:40]); %x-werte set, auf msec.,
%stelle durch stem() Abtastpunkte dar bei Fsa1= ca 80 Hz kann Aliasing gut dargestellt werden
hold on;
Fsa1= 180; %Diese Variieren und damit die Abtastpunkte verdeutlichen, zeitgleich über stückweise Aproximation (interp1 linear und spline) results sehen
dta1=1/Fsa1;
StopTimea1=0.04-dta1;
ta1=(0:dta1:StopTimea1)';
xa1=sin(2*pi*Fc*ta1);
stem(ta1,xa1,'r');
grid on
hold on;
%interpoliere die punkte der ausgangsfunktion xa1=sin(2*pi*Fc*ta1), zu den zeiten ta1 und stelle diese über range t dar
tp=ta1; %xpQuelle für interpl in dem Fall x-werte Abtastpunkte
yp=sin(2*pi*Fc*tp); %yp
xf=t;
lin=interp1(tp,yp,xf);
spline = interp1(tp,yp,xf,'spline');
plot(xf,lin,'g', xf,spline,'m');
hold off;
%fft figure(2);
[mag, mag_dB, fv] = FFT_betragsspektrum( x, nfft, Fs, 0, 0);
stem(fv,mag);
hold on
[mag, mag_dB, fv] = FFT_betragsspektrum( xa1, length(xa1), Fsa1, 0, 0);
stem(fv,mag);
xlim([0120]) title('Betragsspektrum') ylabel('Amplitude') xlabel('Frequenz f [Hz]') grid on
Das Abtasttheorem besagt ja, dass die Abtastfrequenz fa mindestens doppelt so groß sein muss wie die Signalfrequenz. Bei einem Sinus von 100Hz wäre fa = 180 Hz somit eine Verletzung des Theorems. Schau dir nun mal an, was deine Interpolation bei diesem Bsp. erzeugt. Das Ende passt irgendwie nicht so ganz
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.