WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Abtastheorem an einem Sinussignal

 

ash
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2016, 00:19     Titel: Abtastheorem an einem Sinussignal
  Antworten mit Zitat      
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
 


Jetzt versuche ich über stem() bestimmte Wertepaare(x,y) als Abtastpunkte darzustellen. Dabei versuche ich eine Abtasfrequenz von 100 Hz darzustellen:

Code:

   hold on;
   Fsa1= 100;
   dta1=1/Fsa1;
   StopTimea1=0.04;
   ta1=(0:dta1:StopTimea1)';
   xa1=sin(2*pi*Fc*ta1);
   stem(ta1,xa1,'r');
 


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.
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2016, 15:39     Titel:
  Antworten mit Zitat      
Hallo,

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!

Lg
Private Nachricht senden Benutzer-Profile anzeigen
 
ash
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2016, 18:50     Titel:
  Antworten mit Zitat      
Hallo ro_mat,

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!

Vielen Dank im Voraus!!!

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2016, 10:02     Titel:
  Antworten mit Zitat      
Hallo kein Problem, ich mache das ja gerne - also ich dokumentier das so wie ich mir das vorstelle:

Code:

freq = 100; % Frequenz eines Sinus-Signales (hat nichts mit dem abtasten zu tun)
sample = 8000; % Anzahl der absoluten Abtastwerte
dt = 1/sample; % Abtastzeitschritte
tend = 0.04; % Stopzeit - entspricht bei 100Hz vier Sinusschwingungen
t = 0:dt:tend; % Laufvariable

y = sin(2*pi*freq*t); % Sinusschwingung mit 100Hz und 321 Werten (sample * tend + Stelle t=0)

sample = 4000; % Halbe Anzahl der absoluten Abtastwerte
dt1 = 1/sample; % Abtastzeitschritte
t1 = 0:dt1:tend; % Laufvariable

y1 = sin(2*pi*freq*t1); % Sinusschwingung mit 100Hz und 161 Werten (halbe Abtastrate)

plot(t,y,'r',t1,y1,'g');
 


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!
Private Nachricht senden Benutzer-Profile anzeigen
 
ash
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2016, 00:55     Titel:
  Antworten mit Zitat      
Hi,

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);          
   
   %plot(t,x) in Diagramm
   figure;
   plot(t,x);
   xlabel('Zeit(in ms)');
   title('Undersampling, ');
   zoom xon;
   
   %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... Sad

Ich danke dir für deine Unterstützung!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.02.2016, 23:15     Titel:
  Antworten mit Zitat      
Hallo,

für die Darstellung des Frequenzspektrums kannst du die Funktion aus dem Anhang nutzen.

Code:
 %Zeit specs.
   Fs = 8000;                   % Abtastfrequenz
   dt = 1/Fs;                   % Abtastzeitschritte
   StopTime = 0.04-dt;             % Stopzeit - entspricht bei 100Hz vier Sinusschwingungen
   t = (0:dt:StopTime)';        % Laufvariable
   nfft = length(t);
   
   %Sinusschwingung
   Fc = 100;                    % Frequenz eines Sinus-Signals 100 hertz >> T=10ms
   x = sin(2*pi*Fc*t);          
   
   %plot(t,x) in Diagramm
   figure;
   plot(t,x,'b.-');
   xlabel('Zeit(in ms)');
   title('Undersampling');
   zoom xon;
   
   %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([0 120])
   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 Wink

Gruß DSP

FFT_betragsspektrum.m
 Beschreibung:

Download
 Dateiname:  FFT_betragsspektrum.m
 Dateigröße:  1.34 KB
 Heruntergeladen:  465 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.