RekursivI( IIR )Filter mit Matlab entwerfen

OP #797335
Hallo an alle,
es geht um RIAA Entzerrung. [sehen Sie das Bild]
Ich will einen IIR Rekursiv Filter 2-Ordnung (Hochpass) mit Matlab 
entwerfen .
Die Koeffizienten der digitalen Übertragungfunktion b(z^-1)/a(z^-1) in
der absteigenden Potenzen von z,sind:

44,1 KHz % Abtastfrequenz
B =[0,02675918611906 -0,04592084787595 0,019212292972391]
A =[1,00000000000000 -0,73845850035973 -0,17951755477430 ]
Fehler +/-0.25dB

Es ist in Form
Out = b0*in[0] + b1*in[-1] + b2*[-2] -a1*out[-1] -a2*out[-2]
wo in [0, -1, -2] sind die aktuellen Eingabe und der vorherigen 2 ;und
aus [-1,-2] sind in den letzten zwei Ausgänge.

http://www.thel-audioworld.de/module/phono/RIAA.htm
Der Ausgang oder Die lösung sollte so aussehen wie das Bild hier
in Pdf.     http://www.hagtech.com/pdf/riaa.pdf
Angehängte Dateien:
Gast
Wenn du die Filterkoeffizienten hast, dann hast du dein Filter. Was 
willst du noch entwerfen???
Oder du willst es realisieren? Oder wat?
Was wäre, wenn du einfach vernünftig beschreiben würdest, was du genau 
willst, anstatt hier 20 threads zu öffnen, und das Forum mit deiner 
Frage vollzustopfen?

> >Was ist die Frage?
> wie kann ich einen IIR Rekursiv Filter 2-Ordnung (Hochpass) mit Matlab
> entwerfen?.
OP
sorry aber der Aufgabe wurde mir nicht vernünftig erklärt,aber jetzt ist 
klar geworden.
Also die Aufgabe ist einfach einen Sinus sweep (20-20KHz) mit meinem 
Filter filtern.
Ich hab das Programm geschrieben,es gibt trozdem fehler ,weiss ich nicht 
wo die sind,
Das ergebniss solte genau umgehehrt wie das Bild ganz oben.
die sollte wie im Bild in pdf.[X-Achse=Logf,y-Achse=Dämfung].
Ich hoffe,es ist jetzt vernünftig beschrieben.
danke an alle.


%Sinus Sweep(Eingangssignal)
%--------------------------
clear
fsample=44100; %Abtastfrequenz
tend=10;
t=0:tend;
dph=20*2*pi*1/fsample+20000*2*pi*(0:1/fsample:tend)/(tend*fsample);
ph=cumsum(dph);
signal=sin(ph);
signal=abs(fft(signal));
figure (1)
plot(signal(20:3000),'.-')
soundsc(signal,44100)
% Übertragungsfunktion vom Filter
%-------------------------------
B =[0.02675918611906  -0.04592084787595  0.019212292972391];%num
A =[1.00000000000000  -0.73845850035973 -0.17951755477430 ];%den
roots(B);
roots(A);
H=freqz(B,A,441001);%ich glaube hier ist das problem
figure (2)
plot(abs(H));
%Ausgang (gefilterter Eingangssignal)
%---------------------------
for s =1:10000  %nur Probe
OUT(s) = signal(1,s)*abs(H(s,1));
end;
figure (3)
plot(OUT)
soundsc(OUT,44100)
return
Angehängte Dateien:
Gast
> Das ergebniss solte genau umgehehrt wie das Bild ganz oben.
> die sollte wie im Bild in pdf.

Wieso sollte es umgekehrt aussehen? Ich nehme an, dass du mit dem Sweep 
eine breitbandige Anregung erzielen willst. Wenn man ein breitbandiges 
flaches Anregungsspektrum hat, dann sieht das Spektrum des 
Ausgangsignals genauso aus, wie die Frequenzkarakteristik des Filters. 
Wenn du diese flippen willst, musst du das Anregungssignal mit (1-H) 
filtern!

Ich würde vorschlagen, dass du das System statt dem Sweep einfach mit 
einem Dirac-Stoß anregst (z.B. x = [1 zeros(1,100000)]) und damit das 
(Inverse-)Filter anregst (filter(a-b,b,x)).
In Elektor gabs so ein inverses RIAA-Filter schon in den Siebzigern 
untrer dem Namen "RezipRIAA".
Schallplatten werden schon seit Jahrzehnten mit einer Höhenanhebung oder 
Tiefenabsenkung gepresst, weil nur so eine halbe Stunde auf eine Seite 
passt. Die großen Ausschläge im Bassbereich würden einen größeren 
Spurabstand erfordern. Im Tonabnehmer-Vorverstärker wird diese 
Höhenanhebung mit der anfanges gezeigten Tiefpasskurve wieder rückgängig 
gemacht.

Um diese Vorverstärker zu testen (oder um selber Platten herzustellen) 
braucht man das inverse Hochpassfilter. In Reihe zum Verstärker muß 
wieder ein gerader Frequenzgang herauskommen.
Gast
Hallo Unit*(gast),
>Ich würde vorschlagen, dass du das System statt dem Sweep einfach mit
einem Dirac-Stoß anregst (z.B. x = [1 zeros(1,100000)]) und damit das
(Inverse-)Filter anregst (filter(a-b,b,x)).
kannst du mir bitte das Programm schreiben,
danke.
OP
Hallo,
das Ergebinss sollte so ausehen wie die Kurve in (Figure 5) in diesem 
PDF.
http://www.hagtech.com/pdf/riaa.pdf
Ich hab gemacht wie (unit *Gast) gesagt hat,sieht aber nicht gut aus !!
so sieht das Programm aus:

x = [1 zeros(1,44100)]; %Dirac Stoss als Eingang
B =[0.02675918611906  -0.04592084787595  0.019212292972391];%num
A =[1.00000000000000  -0.73845850035973 -0.17951755477430 ];%den
roots(B);
roots(A);
H=freqz(B,A,44100);  %Fs=44100Hz
figure (1)
plot(abs(H),'b')
y=filter(A-B,B,x); %Ausgang (gefilterter Eingangssignal)
figure (2)
plot(y)


Mit simulation hat aber gut funktioniert! das Programm unten gehört zu
Simmulation.

clear IN;
clear H;
clear OUT;
OUT=simouty.signals.values;
  OUT=fft(OUT);
IN=simoutx.signals.values;
  IN=fft(IN);
  for s=1:22050;
    H(s) =OUT(s)/IN(:,:,s);%Out und In sollen gleiche grosse haben
  end
  figure(1)
plot(abs(H));
y=-62:1:-25; %wie kann ich meine Kurve im Bereich [-20 bis 20]
             %verschieben und X-Achse mit "Hz"???
Hlog=20*log10(abs(H));
figure (2);
plot(Hlog)
hold on;
plot(50,y); %erste Eckpunkt =f1
plot(500,y); %zweite Eckpunkt=f2
plot(2122,y); %dritte Eckpunkt=f3
hold off;
Angehängte Dateien:
Gast
> x = [1 zeros(1,44100)]; %Dirac Stoss als Eingang
> B =[0.02675918611906  -0.04592084787595  0.019212292972391];%num
> A =[1.00000000000000  -0.73845850035973 -0.17951755477430 ];%den

Die nächsten beiden Zeilen sind unnötig:

> roots(B);
> roots(A);


> H=freqz(B,A,44100);  %Fs=44100Hz
> figure (1)
> plot(abs(H),'b')

Mensch! H = B/A -> 1-H = (A-B)/A => y = filter(A-B,A,x);

> y=filter(A-B,B,x); %Ausgang (gefilterter Eingangssignal)
> figure (2)

Wieso transformierst du das Signal nicht???

> plot(y)


Von mir aus kannst du auch freqz statt filter benutzen:

H2 = freqz(A-B,A,44100);
figure
plot(abs(H2))
Gast
"aus der Übertragungsgleichung der analogen Schaltung H(s) kann man
irgendwie auf die digitale H(z) umrechnen, möglicherweise bietet Matlab
das als Funktion?"

siehe Z-Transformation
OP
Hallo unit*(gast)
wenn ich so "y=filter(A-B,B,x) "hreibe sttat so"y=filter(B,A,x)"bekomme 
ich einen tiefpass.und ich will Hochpass haben.sehe nochmal PDF.
ich hab jetzt das programm fertiggestelt,sieht so aus:

B =[0.02675918611906  -0.04592084787595  0.019212292972391];%num
A =[1.00000000000000  -0.73845850035973 -0.17951755477430 ];%den
H=freqz(B,A,44100);  %Fs=44100Hz
figure (1)
plot(abs(H),'r')
x = [1 zeros(1,44100)]; %Dirac Stoss als Eingang
y=filter(B,A,x); %Ausgang (gefilterter Eingangssignal)
y=fft(y);
ylog=20*log10(abs(y));
figure (2)
plot(ylog)

die frage jetzt ,wie kann ich meine Kurve um 40db nach oben 
verschieben?? mit Simulation habe ich einen verstärker am Ausgagan 
angeschlossen,wie geht das denn mit M-file, was soll ich zu meinem 
programm noch schreiben?
danke.
Angehängte Dateien:
Gast
Du hast aber folgendes geschrieben:

> Das ergebniss solte genau umgehehrt wie das Bild ganz oben.

Ich dachte du meinst das Bild im pdf. Ok.

+40dB:

y=filter(100*B,A,x);

oder

y = 100*y;

oder

plot(ylog+40)

oder

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.