You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CascadeSynthesisCpp.inl 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //#include <sstream>
  2. //#include <iostream>
  3. //#include <iomanip>
  4. void Cascade::setLayoutSynthesis (const LayoutBase& proto)
  5. {
  6. const int numPoles = proto.getNumPoles();
  7. m_numStages = (numPoles + 1)/ 2;
  8. assert (m_numStages <= m_maxStages);
  9. Biquad* stage = m_stageArray;
  10. for (int i = 0; i < m_numStages; ++i, ++stage)
  11. stage->setPoleZeroPair (proto[i]);
  12. applyScale (proto.getNormalGain() /
  13. std::abs (response (proto.getNormalW() / (2 * doublePi))));
  14. /*
  15. // visu Analysis Filter
  16. stage-=m_numStages;
  17. for (int i=0; i<m_numStages; ++i, ++stage)
  18. {
  19. std::ostringstream os;
  20. os << "Cascade::setLayout : " << i << "\n"
  21. << "Gain = " << proto.getNormalGain() / std::abs (response (proto.getNormalW() / (2 * doublePi))) << "\n"
  22. << "a0[0] = " << stage->m_a0 << "\n"
  23. << "a1[0] = " << stage->m_a1 << "\n"
  24. << "a2[0] = " << stage->m_a2 << "\n"
  25. << "b0[0] = " << stage->m_b0 << "\n"
  26. << "b1[0] = " << stage->m_b1 << "\n"
  27. << "b2[0] = " << stage->m_b2 << "\n";
  28. std::cout << os.str();
  29. }
  30. */
  31. //manual inversion of digital coefficients
  32. stage-=m_numStages;
  33. double a0,a1,a2,b0,b1,b2;
  34. for (int i=0; i<m_numStages; ++i, ++stage)
  35. {
  36. a0 = stage->m_a0;
  37. a1 = stage->m_a1;
  38. a2 = stage->m_a2;
  39. b0 = stage->m_b0;
  40. b1 = stage->m_b1;
  41. b2 = stage->m_b2;
  42. stage->m_a0 = b0;
  43. stage->m_a1 = b1;
  44. stage->m_a2 = b2;
  45. stage->m_b0 = a0;
  46. stage->m_b1 = a1;
  47. stage->m_b2 = a2;
  48. }
  49. applyScale (proto.getNormalGain() / std::abs (response (proto.getNormalW() / (2 * doublePi))));
  50. /*
  51. // visu Synthesis Filter
  52. stage-=m_numStages;
  53. double zeros_discr, poles_discr;
  54. for (int i=0; i<m_numStages; ++i, ++stage)
  55. {
  56. std::ostringstream os;
  57. os << "Cascade::setLayoutSynthesis : " << i << "\n"
  58. << "Gain = " << proto.getNormalGain() / std::abs (response (proto.getNormalW() / (2 * doublePi))) << "\n"
  59. << "a0[0] = " << stage->m_a0 << "\n"
  60. << "a1[0] = " << stage->m_a1 << "\n"
  61. << "a2[0] = " << stage->m_a2 << "\n"
  62. << "b0[0] = " << stage->m_b0 << "\n"
  63. << "b1[0] = " << stage->m_b1 << "\n"
  64. << "b2[0] = " << stage->m_b2 << "\n";
  65. zeros_discr = stage->m_b1*stage->m_b1 - 4*stage->m_b0*stage->m_b2;
  66. poles_discr = stage->m_a1*stage->m_a1 - 4*stage->m_a0*stage->m_a2;
  67. os << "zeros discriminant = " << zeros_discr << "\n";
  68. if(zeros_discr>=0)
  69. {
  70. os << "zeros = " << (-stage->m_b1 + std::sqrt(zeros_discr))/(2*stage->m_b0) << " et " << (-stage->m_b1 - std::sqrt(zeros_discr))/(2*stage->m_b0) << "\n";
  71. }
  72. else
  73. {
  74. os << "zeros = " << (-stage->m_b1)/(2*stage->m_b0) << "+/-i" << std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0) << "\n"
  75. << "zeros abs = " << std::sqrt( (-stage->m_b1)/(2*stage->m_b0)*(-stage->m_b1)/(2*stage->m_b0) + std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0)*std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0) ) << "\n";
  76. }
  77. os << "poles discriminant = " << poles_discr << "\n";
  78. if(poles_discr>=0)
  79. {
  80. os << "poles = " << (-stage->m_a1 + std::sqrt(poles_discr))/(2*stage->m_a0) << " et " << (-stage->m_a1 - std::sqrt(poles_discr))/(2*stage->m_a0) << "\n";
  81. }
  82. else
  83. {
  84. os << "poles = " << (-stage->m_a1)/(2*stage->m_a0) << "+/-i" << std::sqrt(std::abs(poles_discr))/(2*stage->m_a0) << "\n"
  85. << "poles abs = " << std::sqrt( (-stage->m_a1)/(2*stage->m_a0)*(-stage->m_a1)/(2*stage->m_a0) + std::sqrt(std::abs(poles_discr))/(2*stage->m_a0)*std::sqrt(std::abs(poles_discr))/(2*stage->m_a0) ) << "\n";
  86. }
  87. std::cout << os.str();
  88. }
  89. */
  90. }