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

Bessel-Filter an einem digitalen Signal

 

Freefly85
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 27.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2015, 07:51     Titel: Bessel-Filter an einem digitalen Signal
  Antworten mit Zitat      
Hallo,

Ich muss einen Besselfilter (Tiefpassfilter mit einer Grenzfrequenz von 17.5 MHz) an einem digitalen Signal (Vektor mit 16064x1) anwenden.

Wie macht man das? Welche Funktion wäre hier aus der Signal Processing Toolbox am idealsten?

Danke für Eure Hilfe!

Gruss,
Kevin
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.05.2015, 08:25     Titel:
  Antworten mit Zitat      
halli hallo.
Zitat:
Ich muss einen Besselfilter (Tiefpassfilter mit einer Grenzfrequenz von 17.5 MHz) an einem digitalen Signal (Vektor mit 16064x1) anwenden.

Wie macht man das?

das steht doch in der documentation oder? welche fehler treten bei der benutzung auf?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Freefly85
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 27.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2015, 08:46     Titel:
  Antworten mit Zitat      
Den Filter erzeuge ich so:

Code:
Fs = 80e6;                           % Sampling Frequency
[z,p,k] = besself(2,17.5e6);          % Bessel analog filter design
[zd,pd,kd] = bilinear(z,p,k,Fs);    % Analog to digital mapping
sos = zp2sos(zd,pd,kd);             % Convert to SOS form
fvtool(sos)                         % Visualize the digital filter


Der Filter hat 2. Ordnung und wie oben schon geschrieben eine Grenzfrequenz von 17.5 MHz. Diese Codezeilen habe ich von der Dokumentation. Aber das Bodediagramm (welches mit der letzten Zeile erzeugt wird), sieht nicht wie erwartet aus...ich sollte ja bei -3 dB genau 17.5 MHz (oder umgerechnet 109.955 rad/s) erhalten.
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: 28.05.2015, 20:10     Titel:
  Antworten mit Zitat      
Hallo,

kannst du mal bitte den Plot des fvtool zur Filterfrequenzantwort anhängen? Habe gerade kein Matlab zur Verfügung um deinen Code zu testen.

Hast du auch entsprechend im fvtool unter den Eigenschaften für die Magnitude/Frequenzachse die Abtastfreq. angeben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Freefly85
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 27.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2015, 09:38     Titel:
  Antworten mit Zitat      
Ich habe nochmals probiert und den Code umgeschrieben. Funktioniert leider noch immer nicht Evil or Very Mad Ich weiss leider nicht mehr weiter...

Code:
Code:
Fs = 80e6;                  % Sampling frequency [Hz]
Fc = 17.5e6;                % Cut-off frequency [Hz]
Wn = 2*pi*Fc;               % Cut-off frequency [rad/s]

% Generate the filter (bessel low pass)
b = besself(2,Wn);

% Show bode diagram of the filter
fvtool(b,1,'Fs',Fs);

% Applying the filter to the signal
RX_RW_SAMPLE_filtered = filter(b,1,RX_RW_SAMPLE);

% Plot signal
t = linspace(0,1,Fs);
stem(t(1:16064),RX_RW_SAMPLE(1:16064),'r')
hold on; grid on;
stem(t(1:16064),RX_RW_SAMPLE_filtered(1:16064))

title('Filtered samples, sampling frequency: 50 MHz');
xlabel('time [s]');
ylabel('uint16 [LSB]');
legend('original samples','filtered samples');
xlim([0 0.0002008]);



Gewünschte Plots sind im Anhang...

Ich würde mich freuen, wenn mir jemand "unter die Arme greifen könnte".
Vielen Dank!

P.S. irgend etwas stimmt mit dem RX_RW_SAMPLE_filtered nicht. Es ist viel grösser als das Originalsignal (min: -24, max: 40). Evtl. ist der Ursprung des Problems in Wn?

stem.png
 Beschreibung:
Plot vom Signal (samples)

Download
 Dateiname:  stem.png
 Dateigröße:  57.86 KB
 Heruntergeladen:  666 mal
fvtool.png
 Beschreibung:
Bodediagramm

Download
 Dateiname:  fvtool.png
 Dateigröße:  22.14 KB
 Heruntergeladen:  634 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Freefly85
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 27.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.05.2015, 10:13     Titel:
  Antworten mit Zitat      
Ich glaube, ich habe es fast geschafft! stem plot sieht nun schon viel besser aus und auch das Bodediagramm (fvtool) zeigt nun FAST den erwarteten Slope. Allerdings habe ich bei -3 dB nun ca. 12.5 MHz statt der vorgegebenen cut-off Frequenz von 17.5 MHz...?

Code:
Code:
Fs = 80e6;                  % Sampling frequency [Hz]
Fc = 17.5e6;                % Cut-off frequency [Hz]
Wn = 2*pi*Fc;               % Cut-off frequency [rad/s]

% Generate the filter (bessel low pass) and digitalize it
[b,a] = besself(2,Wn);
[bd,ad] = bilinear(b,a,Fs);

% Show the bode diagram of the filter
fvtool(bd,ad,'Fs',Fs);

% Applying the filter to the signal
RX_RW_SAMPLE_filtered = filter(bd,ad,RX_RW_SAMPLE);

% Plot signal
t = linspace(0,1,Fs);
stem(t(1:16064),RX_RW_SAMPLE(1:16064),'r')
hold on; grid on;
stem(t(1:16064),RX_RW_SAMPLE_filtered(1:16064))

title('Filtered samples, sampling frequency: 50 MHz');
xlabel('time [s]');
ylabel('uint16 [LSB]');
legend('original samples','filtered samples');
xlim([0 0.0002008]);


stem2.png
 Beschreibung:

Download
 Dateiname:  stem2.png
 Dateigröße:  109.97 KB
 Heruntergeladen:  612 mal
fvtool2.PNG
 Beschreibung:

Download
 Dateiname:  fvtool2.PNG
 Dateigröße:  22.51 KB
 Heruntergeladen:  656 mal
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: 29.05.2015, 16:33     Titel:
  Antworten mit Zitat      
Evtl. ist es nicht möglich mit 2. Ordnung die gewünschte Grenzfrequenz zu erreichen. Hast du mal eine höhere Ordnung ausprobiert, z.B. 6. Ordnung?

Ich weiß zumindest das folgende Code funktioniert:

Code:

%% SAMPLING FREQUENCY

fs = 1000;                                                      % Sampling Frequency in Hz
n = 10*fs;                                                      % Anzahl der samples

%% BESSEL
                                                 
order_bes = 6;                                                  % Ordnung
fc_bes = 300;                                                   % Cut-off Frequenz in Hz
[z,p,k] = besself(order_bes,fc_bes);                            % Bessel analog filter design
[zd,pd,kd] = bilinear(z,p,k,fs);                                % Analog to digital mapping
sos = zp2sos(zd,pd,kd);                                         % Convert to SOS form
[b_bes,a_bes] = sos2tf(sos);                                    % convert to num and den coefficents

%%% Berechnung der Filterfrequenzantwort

[h_bes, w_bes] = freqz(b_bes, a_bes, n);
[phi_bes, v_bes] = phasez(b_bes, a_bes, n);
f_bes = w_bes/pi*fs/2;
dB_bes = mag2db(abs(h_bes));

%%% AMPLITUDENVERLAUF [dB] gesamt

figure('Name','Phase Response','NumberTitle','off');
plot(f_bes, dB_bes,'Color',orange,'LineStyle','-','LineWidth',LW)
grid on
xlabel('Frequenz [Hz]','FontName','Arial','FontSize',8)
set(gca,'xTick',0:50:500);
ylabel('Amplitude [dB]','FontName','Arial','FontSize',8)

 
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: 01.06.2015, 05:22     Titel:
  Antworten mit Zitat      
Wer lesen kann ist klar im Vorteil. Ich habe mir zwar die Doku zum analogen Bessel Filterentwurf angesehen, aber nicht aufmerksam genug gelesen.

Zitat:

[b,a] = besself(n,Wo) designs an order n lowpass analog Bessel filter, where Wo is the frequency up to which the filter's group delay is approximately constant. Larger values of the filter order (n) produce a group delay that better approximates a constant up to frequency Wo.


Wo in rad/s gibt also nicht die gewünschte Grenzfrequenz des Filters an, sondern jene Frequenz, bis zu dem die Gruppenlaufzeit des Filters konstant ist.
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.