2016-06-16 47 views
0

我正在学习C++,并且根据我目前的知识,我认为我可以制作一个Cauer滤波器,因为所有需要的都是数学。我的问题是我没有起点。我应该选择开关/外壳吗?如果别的?这有点复杂。总的来说,过滤器是5个参数的函数,Ap,As,fp,fs和N(不需要细节),并且对于这5个中的任何4个,第5个会自动出现。因此,例如,如果指定了Ap,则存在一个中间术语epsilonP = sqrt(10 ^(Ap/10)-1),但是如果Ap = 0(需要从其他4个中推导出),则它是As和nomeQ的函数,nomeQ间接地是fp和fs的比率。而且,更糟糕的是,所有这些,epsilonP,nomeQ等都是最终计算所需的。C++ Cauer /椭圆滤波器的起点

起初,我尝试使用的if/else,这里就是我有:

double epsilonP, epsilonS, epsilonSC; 
if (Ap) 
    epsilonP = sqrt(pow(10, Ap/10) - 1); 
else 
    epsilonP = 16 * (pow(10, As/10) - 1) * exp(log(nomeQ) * N); 

但nomeQ是H0的功能(在这种情况下),这是modulusK的功能,这是一个功能fp和fs的比例(或fs/fp,取决于另一个参数filterType),它们是可以指定为null的初始术语,以便可以从其他4!与之类似:如果As> 0,否则f(nomeQ),nomeQ可以如上所述是f(h0),或者N的直接函数是F(As),否则f是上面的f(fp,fs),或者取决于nomeQ2,这是N和nomeQ1的函数...我希望你看到我的问题。

只要你没有得到错误的想法,过滤器就在LTspice中实现并工作(请参阅ltspicegoodies.ltwiki.org/files/Filter.7z或.zip - 在过滤器内搜索“subckt Cauer” .sub),但是由于LTspice只能做很多事情(只有N,Ap或As可以为空),所以并非一切皆有可能。这就是为什么我开始学习C++,但是...在这里,我是。

所以,我的问题:任何人都可以提出一个这样的起点吗?我不是说有人为我做这件事,只是要求如何解决这个迷宫问题的建议。而且我不是在谈论每个可能性的程序,这不是一个解决方案。我开始写它,但是当我到了epsilonP并且我意识到了复杂性时,我只是停下来思考。

回答

0

我设法带开关/情况下,像这样做:

input fp, fs, Ap, As, N; 
int test {(fp > 0) + 2*(fs > 0) + 3*(Ap > 0) + 4*(As > 0) + 5*(N > 0)}; 
switch (test) 
{ 
    case 14: nomeQ, modulusK, ... 
    case 13: nomeQ, modulusK, ... 
    case 12: 
    case 11: 
    default: 
    case 10: 
} 
rest of the code; 

我不肯定知道是什么,如果在的情况下也不会抱怨,例如,除以零非真正的分支。显然,即使真正的分支由于计算而被零除,它也会被编译,但是在运行时会崩溃。对于错误的分支,它乐于忽略它们。

到目前为止,这似乎是最好的解决方案,但我的问题仍然存在:如果有更多经验的人遇到类似这样的事情,我会感激提示或推动正确方向的更好解决方案(这可以“ t是唯一的)。我只是在学习C++。