2016-05-25 8 views
1

Ich habe einen angepassten Filter, den ich seine Frequenzgang in Matlab plotten möchte.Matlab Element-weise Macht - kann nicht verstehen, wie es funktioniert

Die Filterantwort ist: H (f) = Frequency response of wiener filter

Ich habe versucht, es zu plotten mit:

%Freqency_Response_of_wiener_filter 
f = linspace(-1e3,1e3,1e5); 
H = ((2*pi*f)^2+10^6)/(11*(2*pi*f)^2+10^6+10^4); 
plot(f,H); 
xlabel('f') 
ylabel('H(f)') 

, die nicht funktioniert, gibt mir Fehler von 'Matrix Dimensionen müssen übereinstimmen' Art. Ich lese über ‚elementweise Macht‘, dann die genau zu passen scheint, was ich brauche, und änderte H zu:

H = ((2*pi*f).^2+10^6)/(11*(2*pi*f).^2+10^6+10^4); 

dies in der Tat Grundstück etwas, was einfach nicht ich :) will Ich habe auch versucht

H = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4); 

ohne Glück. Der einzige Weg, habe ich es Arbeit ist:

%Freqency_Response_of_wiener_filter 
f = linspace(-1e3,1e3,1e5); 
for i=1:length(f) 
    H(i) = ((2*pi*f(i))^2+10^6)/(11*(2*pi*f(i))^2+10^6+10^4); 
end 
plot(f,H); 

Warum ist ‚elementweise Macht‘ nicht für mich arbeiten?

Mehr noch - was genau ist der Unterschied zwischen normalem Betrieb und elementweisem Betrieb? Weil zum Beispiel hier: An Introduction to Matlab, gibt es dieses Grundstück:

a = 0:.01:5; 
b = cos(2*pi*a); 
plot(a,b) 

und dann diese:

x = 2:.1:4; 
y = 1./x; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

und ich keinen Unterschied zwischen ihnen nicht sagen. Warum brauchte man auf der ersten Stufe keine "elementweise Operation", während in der zweiten es war?

Danke.

+2

Einfache Faustregel: Wenn Sie elementweise Operationen ausführen wollen: Chuck in einen Punkt vor jedem '/', '*' und '^'.Es ist ein wenig übertrieben, d. H. '2. * pi' macht nichts anderes als' 2 * pi', da beide bereits Skalare sind, aber zumindest würde es Sie davor bewahren, diese Art von schwer zu findenden Fehlern zu debuggen. – Adriaan

+1

Ich zweite Adriaan Kommentar. Sie brauchen es nicht, um einen Skalar mit einer Matrix zu multiplizieren, aber wenn Sie zwei Matrizen ('x, y') mit einem Skalar (' k') dazwischen haben, können Sie Probleme beim Debuggen bekommen: 'x * k' und 'k * y' funktionieren beide, aber' x * k * y' verursacht einen Fehler. Anstatt herauszufinden, wo der Punkt/die Punkte platziert werden sollen, setze einfach beide Orte: 'x. * K. * Y'. –

Antwort

3

Der Grund, warum H = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4); nicht ist nicht funktioniert, weil Sie ./ brauchen:

H = ((2*pi)^2*f.^2+10^6)./(11*(2*pi)^2*f.^2+10^6+10^4); 

Im ersten Fall:

a = 0:.01:5; 
b = cos(2*pi*a); 
plot(a,b) 

Sie nicht benötigen ein Element-weise-Betrieb, da nur dort ist eine Art, den Kosinus eines Vektors oder einer Matrix zu machen.

Auf der anderen Seite, in einem anderen Fall:

x = 2:.1:4; 
y = x.^2; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

Sie müssen angeben, dass Sie das Element weist Betrieb eher machen wollen als selbst die Matrix multipliziert wird (die nur für quadratische Matrizen funktioniert).

Im zweiten Fall, dass Sie schreiben:

x = 2:.1:4; 
y = 1./x; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

Sie die . müssen, so dass Matlab verstehen, dass 1 ein Vektor von Einsen mit einer Länge numel(x) sein muss.