¿Cómo calculo la impedancia de un condensador (bypass) (para simulación)?

Quería construir una simulación de condensadores de derivación en Matlab, especialmente para jugar con pares de condensadores de diferentes valores. Así que pensé en tomar un modelo de un capacitor real como una conexión en serie de capacitor con una resistencia (ESR) y un inductor (ESL) y derivar la fórmula

Z = mi S R + j 2 π F mi S L + 1 j 2 π F C
separando en parte real e imaginaria:
Z = mi S R + j ( 2 π F mi S L 1 2 π F C )
ahora toma la magnitud
| Z | = mi S R 2 + ( 2 π F mi S L 1 2 π F C ) 2

Ahora programé el Matlab. primero la función que calcula la impedancia de la tapa a la frecuencia o frecuencias dadas

function [ Z ] = calcCapImp( f,R, L,C )  
Z=sqrt(R^2+(2*pi*f*L-1./(2*pi*C*f)).^2);
end

El código para calcular y graficar la impedancia de una combinación de dos capacitores en Ohms y dBs:

clear all;
f=10000:1000:1e9;
Z=(zeros(size(f)));
for i=1:size(f,2)
Z1=calcCapImp(f(i),10e-3,700e-12,100e-9);%calculate first cap
Z2=calcCapImp(f(i),10e-3,1250e-12,4.7e-6);%calculate second  cap
Z(i)=(Z1*Z2)/(Z1+Z2);%Total impedance is parallel combination
end
loglog(f,Z);
ylabel('Resistance, Ohm');
xlabel('Frequency, Hz');
grid on;
figure;
Z=20*log10(Z);%convert to decibels
semilogx(f,Z);
xlabel('Frequency, Hz');
ylabel('Resistance, dB');
grid on;

Si bien los resultados parecen plausibles,

ingrese la descripción de la imagen aquí

No puedo reproducir el gráfico que he visto en otros lugares.

En particular, el código anterior intenta recrear la Figura 2 desde aquí (mismo rango):

ingrese la descripción de la imagen aquí

No obtengo un pico tan dramático a ~ 10 MHz como en la figura externa mencionada anteriormente (aproximadamente 10 veces/20 dB más pequeña)

¿He hecho bien los cálculos? ¿Hay algún error en mi simulación?

EDITAR: aquí el código y el gráfico corregidos según la respuesta de The Photon a continuación

function [ Z ] = calcCapImp( f,R, L,C )

Z=R+1i*(2*pi*f*L-1./(2*pi*C*f));

end

clear all;
f=10000:1000:1e9;
Z=(zeros(size(f)));
for i=1:size(f,2)
Z1=calcCapImp(f(i),10e-3,700e-12,100e-9);%calculate first cap
Z2=calcCapImp(f(i),10e-3,1250e-12,4.7e-6);%calculate second  cap
Z(i)=abs((Z1*Z2)/(Z1+Z2));%Total impedance is parallel combination, take the magnitude
end

loglog(f,Z);
ylabel('Impedance, Ohm');
xlabel('Frequency, Hz');
title('Impedance in Ohms');
grid on;
figure;
Zdb=20*log10(Z);%convert to decibels
semilogx(f,Zdb);
xlabel('Frequency, Hz');
ylabel('Impedance, dB');
title('Impedance in decibels');
grid on;

gráfico corregidoAhora el resultado es prácticamente idéntico a los utilizados como referencia.

Los dos gráficos se ven bastante cerca de mí. ¿O el segundo no es tus resultados? De lo contrario, debe incluir un gráfico de sus resultados para dejar en claro cuál es la diferencia entre su resultado esperado y su resultado real.
Lo comparo con este i.cmpnet.com/planetanalog/2007/10/C0238-Figure2.gif de planetanalog.com/document.asp?doc_id=527551 No pude incluirlo también debido a la limitación. este es uno que intento recrear
La clave de la diferencia es que el pico es mayor que cualquiera de las curvas de impedancia por sí solas, por lo que se obtiene una interferencia constructiva entre los componentes, es decir, las impedancias se oponen en fase, por lo que sus componentes imaginarios se cancelan. Con eso en mente, lea la respuesta de Photon.

Respuestas (1)

function [ Z ] = calcCapImp( f,R, L,C )  
Z=sqrt(R^2+(2*pi*f*L-1./(2*pi*C*f)).^2);
end

Esto está calculando la magnitud de Z, no Z en sí.

Z(i)=(Z1*Z2)/(Z1+Z2);%Total impedance is parallel combination

Esto es combinar las dos magnitudes como si fueran dos resistencias.

Debe calcular la impedancia compleja y combinar las impedancias complejas con la fórmula de impedancias paralelas

Z mi q = Z 1 Z 2 Z 1 + Z 2

Lo que calculaste fue

Z mi q = | Z 1 | | Z 2 | | Z 1 | + | Z 2 |

(* el superíndice indica una fórmula incorrecta)

que no tiene en cuenta la interacción de los cambios de fase en las dos impedancias combinadas, por lo que no da el resultado correcto.

Ah, claro. De alguna manera, también perdí de vista que puedo manipular directamente números complejos en Matlab e hice las cosas más complicadas de lo necesario. Corregí el código y el resultado es, al menos, mucho mejor ahora.