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

Upsampling mit anschließendem Tiefpass

 

mrnoname89
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 11.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2014, 14:31     Titel: Upsampling mit anschließendem Tiefpass
  Antworten mit Zitat      
Hallo zusammen,

derzeit versuche ich, die Interpolationsfunktion von Matlab (interp(..)) für meinen Zweck selbst nachzubauen, um mir ein besseres Verständnis zu erarbeiten.

Hierzu habe ich ein Skript File entwickelt, in dem ich Schritt für Schritt das Upsampling durchführe.

Einmal lasse ich das Skript File wie folgt ablaufen:

Code:

x = [ 1 6 7 9 10 14 2 7 9 5 3 9 2];

upsamplevalue = 1;
Fs = upsamplevalue;                    % Sampling frequency
x = upsample(x, upsamplevalue);
%x = interp(x,2);
T = 1/Fs;                     % Sample time
L = length(x);                     % Length of signal
t = (0:L-1)*T;                % Time vector

% f_tp = 0.5;
% %Tiefpassfilterung
%  [b a] = butter(50,f_tp/(0.5*Fs),'low'); % Koeffizienten der Übertragungsfunktion, f_tp ist die Grenzfrequenz, fs die Abtastfrequ., Butterworthfilter
% figure(3)
% freqz(b,a);
%  x = 2*filter(b,a,x); %x ist das Signal

% h = fir1(100,0.5);
%
% x = conv(x,h);




NFFT = 2^nextpow2(L); % Next power of 2 from length of y
X = fft(x,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);



% Plot single-sided amplitude spectrum.
figure(1)
plot(f,4*abs(X(1:NFFT/2+1)))
title('Rechtsseitiges Spektrum der 1.Nyquistzone |Y_{2\uparrow TP}(f))|')
xlabel('Frequency (Hz)')
ylabel('|Y_{2\uparrow}(f))|')

figure(2)
stem(0:1/upsamplevalue:(length(x)-1)/upsamplevalue, x)
title('Diskretes Eingangssignal x_{2\uparrow TP}(t)')
xlabel('Zeit t in s')
ylabel('x(t)_{2\uparrow TP}');
 


Dabei erhalte ich zwei Plots. Einmal meine Abtastwerte im Zeitbereich, und einmal das dazugehörige Spektrum (1.Nyquistzone).

Das Spektrum startet dabei mit einer maximalen Amplitude von ca. 25.

Anschließend lasse ich das Skript erneut durchlaufen, erhöhe aber meinen Parameter upsamplevalue auf den Wert 2.
Dadurch habe ich zwischen allen Abtastwerten zusätzliche Nullstellen. Das Spektrum ist dabei sozusagen zweimal innerhalb meiner 1.Nyquistzone zu sehen, da diese aufgrund des Upsamplings und der folgich doppelt so großen Abtastrate verdoppelt wurde.

Hier mein erstes Problem, mein Spektrum sollte meinen Theorieerkenntnissen nun nur doppelt vorhanden sein, jedoch mit gleicher Amplitude. Bei mir ist die Amplitude aber nun nur noch betragsmäßig halb so groß (maximal Wert zu Beginn bei ca. 13)

Die FFT Funktion habe ich von Matlab beispielen verwendet, dabei wird die fft wie im Code zu sehen ist, durch L geteilt (Länge des Signalvektors).
Warum ist mein Spektrum beträgsmäßig halb so groß nach dem Zerostuffing, Upsampling?

Zudem wollte ich nun als letzten Schritt, mein upgesampeltes Signal noch mit einem Tiefpass filtern. Hierzu kommentiere ich aus meinem Quellcode zusätzlich die beiden Zeilen ein, zur Erzeugung des fir1 Tiefpasses mit der Grenzfrequenz 0.5 und falte den Tiefpass anschließend mit meinem Eingangssignal x.
Im Spektrum erkenne ich dabei auch, dass die Frequenzen unterhalb von 0.5 Hz weggeschnitten wurden.
Jedoch wurden in meinem Zeitsignal wie erwartet nicht nur die Nullstellen interpoliert sondern auch meine ursprünglichen Stützstellen verändert.
Woran liegt das, verwende ich das Filter falsch?

Wenn ich die von Matlab verwendete interp-Funktion verwende erhalte ich auch das erwartete Spektrum, aber die korrekte Zeitfunktion.

Wäre super, wenn jemand eine Idee hat.

Danke Wink
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: 11.11.2014, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

deine Skalierung der Amplitude ist nicht korrekt. Siehe hier: http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Code:

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
X = fft(x,NFFT);
f = Fs/2*linspace(0,1,NFFT/2+1);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(X);
% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/NFFT amplH(2:NFFT/2)/(NFFT/2) amplH(NFFT/2 + 1)/NFFT]; % DC-Bin auf N normieren!


% Plot single-sided amplitude spectrum.
figure(1)
stem(f,amplitudengang)
 


Die weiteren Fragen kann ich erstmal nicht beantworten. Dazu müsste ich den Code selbst mal ausführen.
Private Nachricht senden Benutzer-Profile anzeigen
 
mrnoname89
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 11.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2014, 17:43     Titel:
  Antworten mit Zitat      
Hey,

danke für deine Anmerkung.

Ich habe auch unter dem angegebenen Link nochmals nachgeschaut, und auch deine Änderungen eingepflegt, aber weiterhin ist das Problem, dass bei einem upsamplevalue von 2 die gesamte Amplitude um den Faktor 2 kleiner ist. (Also im Vergleich zu einem upsamplevalue von 1, also kein upsampeln).

Ich könnten natürlich auch einfach immer auf meinen Maximalwert der FFT normieren, jedoch würde ich dann nur die Amplitude "schmutzig" gleichsetzen, obwohl dies gar nicht stimmt.
Warum ist also meine Amplitude um den Faktor 2 skaliert, bei einem upsamplevalue von 2? In der Theorie sollte doch das gleiche Spektrum erscheinen, nur dass die Nyquistzone doppelt so groß ist, und ich somit ein Spiegelspektrum erhalte.

Hat desweiteren noch jemand eine Idee, wie ich das zweite Spiegelspektrum z.B. mit einem FIR Filter wegbekomme. Ich habe dies bislang versucht, jedoch komme ich auf keinen grünen Zweig.
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: 11.11.2014, 22:22     Titel:
  Antworten mit Zitat      
Nicht sehr schön...aber dafür die Lösung. Ich habe mal als Testsignal einen einfachen Sinus erzeugt, da mir damit der Zusammenhang klarer ist. Das Signal muss um den Faktor upsamplevalue vor dem Filter multipliziert werden, da ja eine lineare Interpolation gefordert wird...sprich der Mittelwert zwischen zwei real existierenden Messwerten gesucht wird. Durch das Einfügen von Nullen, wird ja aber der Mittelwert kleiner und der Korrekturfaktor somit unumgänglich.

Code:

clear;

upsamplevalue = 2;
Fs = 100;                    % Sampling frequency
L = 1024;
T = 1/Fs;                     % Sample time
t = (0:L-1)*T;                % Time vector
df = Fs/L; % Auflösung Freq.-spektrum
freq = df * 100; % ganzes Vielfaches von df damit kein leakage auftritt
x = 10 * sin(2*pi*freq*t); % sinus mit Freq. = 10.24Hz und Amplitude = 10
Fs_up = Fs * upsamplevalue;
x_up = upsample(x, upsamplevalue); % enspricht Einfügen von upsamplevalue Nullen zwischen 2 Werten
%x = interp(x,2);

T_up = 1/Fs_up;
L_up = length(x_up);                     % Length of signal
t_up = (0:L_up-1)*T_up;                % Time vector
df_up = Fs_up/L_up; % Auflösung Freq.-spektrum

y_interp = interp(x,upsamplevalue);

f_tp = 0.5*Fs;
% %Tiefpassfilterung
[b, a] = butter(4,f_tp/(0.5*Fs_up),'low'); % Koeffizienten der Übertragungsfunktion, f_tp ist die Grenzfrequenz, fs die Abtastfrequ., Butterworthfilter
%b = fir1(10,f_tp/(0.5*Fs_up));
% figure(3)
% freqz(b,a);
x_up_filt = filtfilt(b,a,upsamplevalue*x_up); %x_up ist das Signal nach upsample
% filtfilt wird verwendet damit kein Filterdelay zu sehen ist
% Korrekturfaktor = upsamplevalue

 

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
X = fft(x,NFFT);
f = Fs/2*linspace(0,1,NFFT/2+1);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(X);
% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/NFFT amplH(2:NFFT/2)/(NFFT/2) amplH(NFFT/2 + 1)/NFFT]; % DC-Bin auf N normieren!


% Plot single-sided amplitude spectrum.
figure(1)
subplot(2,1,1);
stem(f,amplitudengang,'b');
legend('orig. signal')
title('Rechtsseitiges Spektrum der 1.Nyquistzone |Y_{2\uparrow TP}(f))|')
xlabel('Frequency (Hz)')
ylabel('|Y_{2\uparrow}(f))|')

subplot(2,1,2);
NFFT = 2^nextpow2(L_up); % Next power of 2 from length of y
X = fft(x_up_filt,NFFT);
f = Fs_up/2*linspace(0,1,NFFT/2+1);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(X);
% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/NFFT amplH(2:NFFT/2)/(NFFT/2) amplH(NFFT/2 + 1)/NFFT]; % DC-Bin auf N normieren!
stem(f,amplitudengang,'r'); hold on;


X = fft(y_interp,NFFT);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(X);
% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/NFFT amplH(2:NFFT/2)/(NFFT/2) amplH(NFFT/2 + 1)/NFFT]; % DC-Bin auf N normieren!

stem(f,amplitudengang,'k');
legend('upsample','interp')
title('Rechtsseitiges Spektrum der 1.Nyquistzone |Y_{2\uparrow TP}(f))|')
xlabel('Frequency (Hz)')
ylabel('|Y_{2\uparrow}(f))|')

figure(2)
y = nan(1,L_up);
y(1:upsamplevalue:L_up) = x;

plot(t_up, y,'b*',t_up,x_up_filt, 'r+--',t_up,y_interp,'k.-');grid on;
legend('orig. signal','upsample','interp')
title('Diskretes Eingangssignal x_{2\uparrow TP}(t)')
xlim([0 2*(1/freq)]);
ylim([-11 11]);
xlabel('Zeit t in s')
ylabel('x(t)_{2\uparrow TP}');
 
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 - 2024 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.