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.

Utilities.h 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /*******************************************************************************
  2. "A Collection of Useful C++ Classes for Digital Signal Processing"
  3. By Vinnie Falco
  4. Official project location:
  5. https://github.com/vinniefalco/DSPFilters
  6. See Documentation.cpp for contact information, notes, and bibliography.
  7. --------------------------------------------------------------------------------
  8. License: MIT License (http://www.opensource.org/licenses/mit-license.php)
  9. Copyright (c) 2009 by Vinnie Falco
  10. Permission is hereby granted, free of charge, to any person obtaining a copy
  11. of this software and associated documentation files (the "Software"), to deal
  12. in the Software without restriction, including without limitation the rights
  13. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. copies of the Software, and to permit persons to whom the Software is
  15. furnished to do so, subject to the following conditions:
  16. The above copyright notice and this permission notice shall be included in
  17. all copies or substantial portions of the Software.
  18. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24. THE SOFTWARE.
  25. *******************************************************************************/
  26. #ifndef DSPFILTERS_UTILITIES_H
  27. #define DSPFILTERS_UTILITIES_H
  28. #include "Common.h"
  29. namespace Dsp
  30. {
  31. /*
  32. * Utilities
  33. *
  34. * These routines are handy for manipulating buffers of samples.
  35. *
  36. */
  37. //------------------------------------------------------------------------------
  38. // Add src samples to dest, without clip or overflow checking.
  39. template <class Td,
  40. class Ts>
  41. void add(int samples,
  42. Td* dest,
  43. Ts const* src,
  44. int destSkip = 0,
  45. int srcSkip = 0)
  46. {
  47. if (srcSkip != 0 || destSkip != 0)
  48. {
  49. ++srcSkip;
  50. ++destSkip;
  51. while (--samples >= 0)
  52. {
  53. *dest = Td(*src);
  54. dest += destSkip;
  55. src += srcSkip;
  56. }
  57. }
  58. else { while (--samples >= 0) *dest++ += Td(*src++); }
  59. }
  60. // Multichannel add
  61. template <typename Td,
  62. typename Ts>
  63. void add(int channels,
  64. int samples,
  65. Td* const* dest,
  66. Ts const* const* src) { for (int i = channels; --i >= 0;) add(samples, dest[i], src[i]); }
  67. //--------------------------------------------------------------------------
  68. // Copy samples from src to dest, which may not overlap. Performs an implicit
  69. // type conversion if Ts and Td are different (for example, float to double).
  70. template <typename Td,
  71. typename Ts>
  72. void copy(int samples,
  73. Td* dest,
  74. Ts const* src,
  75. int destSkip = 0,
  76. int srcSkip = 0)
  77. {
  78. if (srcSkip != 0)
  79. {
  80. if (destSkip != 0)
  81. {
  82. ++srcSkip;
  83. ++destSkip;
  84. while (--samples >= 0)
  85. {
  86. *dest++ = *src++;
  87. dest += destSkip;
  88. src += srcSkip;
  89. }
  90. }
  91. else
  92. {
  93. ++srcSkip;
  94. while (--samples >= 0)
  95. {
  96. *dest++ = *src++;
  97. src += srcSkip;
  98. }
  99. }
  100. }
  101. else if (destSkip != 0)
  102. {
  103. ++destSkip;
  104. while (--samples >= 0)
  105. {
  106. *dest = *src++;
  107. dest += destSkip;
  108. }
  109. }
  110. else { while (--samples >= 0) *dest++ = *src++; }
  111. }
  112. // Wrapper that uses memcpy if there is no skip and the types are the same
  113. template <typename Ty>
  114. void copy(int samples,
  115. Ty* dest,
  116. Ty const* src,
  117. int destSkip = 0,
  118. int srcSkip = 0)
  119. {
  120. if (destSkip != 0 || srcSkip != 0) copy<Ty, Ty>(samples, dest, src, destSkip, srcSkip);
  121. else ::memcpy(dest, src, samples * sizeof(src[0]));
  122. }
  123. // Copy a set of channels from src to dest, with implicit type conversion.
  124. template <typename Td,
  125. typename Ts>
  126. void copy(int channels,
  127. int samples,
  128. Td* const* dest,
  129. Ts const* const* src,
  130. int destSkip = 0,
  131. int srcSkip = 0) { for (int i = channels; --i >= 0;) copy(samples, dest[i], src[i], destSkip, srcSkip); }
  132. //--------------------------------------------------------------------------
  133. // Deinterleave channels. Performs implicit type conversion.
  134. template <typename Td, typename Ts>
  135. void deinterleave(int channels,
  136. int samples,
  137. Td* const* dest,
  138. Ts const* src)
  139. {
  140. assert(channels > 1);
  141. switch (channels)
  142. {
  143. case 2:
  144. {
  145. Td* l = dest[0];
  146. Td* r = dest[1];
  147. int n = (samples + 7) / 8;
  148. switch (samples % 8)
  149. {
  150. case 0: do
  151. {
  152. *l++ = *src++;
  153. *r++ = *src++;
  154. case 7: *l++ = *src++;
  155. *r++ = *src++;
  156. case 6: *l++ = *src++;
  157. *r++ = *src++;
  158. case 5: *l++ = *src++;
  159. *r++ = *src++;
  160. case 4: *l++ = *src++;
  161. *r++ = *src++;
  162. case 3: *l++ = *src++;
  163. *r++ = *src++;
  164. case 2: *l++ = *src++;
  165. *r++ = *src++;
  166. case 1: *l++ = *src++;
  167. *r++ = *src++;
  168. } while (--n > 0);
  169. default: break;
  170. }
  171. }
  172. break;
  173. default:
  174. for (int i = channels; --i >= 0;) copy(samples, dest[i], src + i, 0, channels - 1);
  175. break;
  176. }
  177. }
  178. // Convenience for a stereo pair of channels
  179. template <typename Td,
  180. typename Ts>
  181. void deinterleave(int samples,
  182. Td* left,
  183. Td* right,
  184. Ts const* src)
  185. {
  186. Td* dest[2];
  187. dest[0] = left;
  188. dest[1] = right;
  189. deinterleave(2, samples, dest, src);
  190. }
  191. //--------------------------------------------------------------------------
  192. // Fade dest
  193. template <typename Td,
  194. typename Ty>
  195. void fade(int samples,
  196. Td* dest,
  197. Ty start = 0,
  198. Ty end = 1)
  199. {
  200. Ty t = start;
  201. Ty dt = (end - start) / samples;
  202. while (--samples >= 0)
  203. {
  204. *dest++ *= t;
  205. t += dt;
  206. }
  207. }
  208. // Fade dest cannels
  209. template <typename Td,
  210. typename Ty>
  211. void fade(int channels,
  212. int samples,
  213. Td* const* dest,
  214. Ty start = 0,
  215. Ty end = 1) { for (int i = channels; --i >= 0;) fade(samples, dest[i], start, end); }
  216. // Fade src into dest
  217. template <typename Td,
  218. typename Ts,
  219. typename Ty>
  220. void fade(int samples,
  221. Td* dest,
  222. Ts const* src,
  223. Ty start = 0,
  224. Ty end = 1)
  225. {
  226. Ty t = start;
  227. Ty dt = (end - start) / samples;
  228. while (--samples >= 0)
  229. {
  230. *dest = Td(*dest + t * (*src++ - *dest));
  231. ++dest;
  232. t += dt;
  233. }
  234. }
  235. // Fade src channels into dest channels
  236. template <typename Td,
  237. typename Ts,
  238. typename Ty>
  239. void fade(int channels,
  240. int samples,
  241. Td* const* dest,
  242. Ts const* const* src,
  243. Ty start = 0,
  244. Ty end = 1) { for (int i = channels; --i >= 0;) fade(samples, dest[i], src[i], start, end); }
  245. //--------------------------------------------------------------------------
  246. // Interleave separate channels from source pointers to destination
  247. // (Destination requires channels*frames samples of storage). Performs
  248. // implicit type conversion.
  249. template <typename Td,
  250. typename Ts>
  251. void interleave(int channels,
  252. size_t samples,
  253. Td* dest,
  254. Ts const* const* src)
  255. {
  256. assert(channels>1);
  257. if (samples == 0) return;
  258. switch (channels)
  259. {
  260. case 2:
  261. {
  262. const Ts* l = src[0];
  263. const Ts* r = src[1];
  264. // note that Duff's Device only works when samples>0
  265. int n = (samples + 7) / 8;
  266. switch (samples % 8)
  267. {
  268. case 0: do
  269. {
  270. *dest++ = *l++;
  271. *dest++ = *r++;
  272. case 7: *dest++ = *l++;
  273. *dest++ = *r++;
  274. case 6: *dest++ = *l++;
  275. *dest++ = *r++;
  276. case 5: *dest++ = *l++;
  277. *dest++ = *r++;
  278. case 4: *dest++ = *l++;
  279. *dest++ = *r++;
  280. case 3: *dest++ = *l++;
  281. *dest++ = *r++;
  282. case 2: *dest++ = *l++;
  283. *dest++ = *r++;
  284. case 1: *dest++ = *l++;
  285. *dest++ = *r++;
  286. } while (--n > 0);
  287. default: break;
  288. }
  289. }
  290. break;
  291. default: { for (int i = channels; --i >= 0;) copy(samples, dest + i, src[i], channels - 1, 0); }
  292. break;
  293. }
  294. }
  295. //--------------------------------------------------------------------------
  296. // Convenience for a stereo channel pair
  297. template <typename Td,
  298. typename Ts>
  299. void interleave(int samples,
  300. Td* dest,
  301. Ts const* left,
  302. Ts const* right)
  303. {
  304. const Ts* src[2];
  305. src[0] = left;
  306. src[1] = right;
  307. interleave(2, samples, dest, src);
  308. }
  309. //--------------------------------------------------------------------------
  310. // Multiply samples by a constant, without clip or overflow checking.
  311. template <typename Td,
  312. typename Ty>
  313. void multiply(int samples,
  314. Td* dest,
  315. Ty factor,
  316. int destSkip = 0)
  317. {
  318. if (destSkip != 0)
  319. {
  320. ++destSkip;
  321. while (--samples >= 0)
  322. {
  323. *dest = Td(*dest * factor);
  324. dest += destSkip;
  325. }
  326. }
  327. else
  328. {
  329. while (--samples >= 0)
  330. {
  331. *dest = Td(*dest * factor);
  332. ++dest;
  333. }
  334. }
  335. }
  336. // Multiply a set of channels by a constant.
  337. template <typename Td,
  338. typename Ty>
  339. void multiply(int channels,
  340. int samples,
  341. Td* const* dest,
  342. Ty factor,
  343. int destSkip = 0) { for (int i = channels; --i >= 0;) multiply(samples, dest[i], factor, destSkip); }
  344. //--------------------------------------------------------------------------
  345. // Copy samples from src to dest in reversed order. Performs implicit
  346. // type conversion. src and dest may not overlap.
  347. template <typename Td,
  348. typename Ts>
  349. void reverse(int samples,
  350. Td* dest,
  351. Ts const* src,
  352. int destSkip = 0,
  353. int srcSkip = 0)
  354. {
  355. src += (srcSkip + 1) * samples;
  356. if (srcSkip != 0 || destSkip == 0)
  357. {
  358. ++srcSkip;
  359. ++destSkip;
  360. while (--samples >= 0)
  361. {
  362. src -= srcSkip;
  363. *dest = *src;
  364. dest += destSkip;
  365. }
  366. }
  367. else { while (--samples >= 0) *dest++ = *--src; }
  368. }
  369. template <typename Td, typename Ts>
  370. void reverse(int channels, size_t frames, Td* const* dest, const Ts* const* src) { for (int i = channels; --i >= 0;) reverse(frames, dest[i], src[i]); }
  371. //--------------------------------------------------------------------------
  372. template <typename Tn>
  373. void to_mono(int samples, Tn* dest, Tn const* left, Tn const* right)
  374. {
  375. #if 1
  376. while (samples-- > 0) *dest++ = (*left++ + *right++) * Tn(0.70710678118654752440084436210485);
  377. #else
  378. while (samples-- > 0)
  379. *dest++ = (*left++ + *right++) * Tn(0.5);
  380. #endif
  381. }
  382. //--------------------------------------------------------------------------
  383. template <typename T>
  384. void validate(int numChannels, int nSamples, T const* const* src)
  385. {
  386. for (int i = 0; i < numChannels; ++i)
  387. {
  388. T const* p = src[i];
  389. for (int j = nSamples; j > 0; --j)
  390. {
  391. T v = *p++;
  392. assert(v < 2 && v > -2);
  393. }
  394. }
  395. }
  396. //--------------------------------------------------------------------------
  397. #if 0
  398. /*
  399. * this stuff all depends on is_pod which is not always available
  400. *
  401. */
  402. namespace detail {
  403. template <typename Ty,
  404. bool isPod>
  405. struct zero
  406. {
  407. static void process (int samples,
  408. Ty* dest,
  409. int destSkip)
  410. {
  411. if (destSkip != 0)
  412. {
  413. ++destSkip;
  414. while (--samples >= 0)
  415. {
  416. *dest = Ty();
  417. dest += destSkip;
  418. }
  419. }
  420. else
  421. {
  422. std::fill (dest, dest + samples, Ty());
  423. }
  424. }
  425. };
  426. template <typename Ty>
  427. struct zero<Ty, true>
  428. {
  429. static void process (int samples,
  430. Ty* dest,
  431. int destSkip)
  432. {
  433. if (destSkip != 0)
  434. zero<Ty,false>::process (samples, dest, destSkip);
  435. else
  436. ::memset (dest, 0, samples * sizeof(dest[0]));
  437. }
  438. };
  439. }
  440. // Fill a channel with zeros. This works even if Ty is not a basic type.
  441. template <typename Ty>
  442. void zero (int samples,
  443. Ty* dest,
  444. int destSkip = 0)
  445. {
  446. detail::zero<Ty, tr1::is_pod<Ty>::value>::process (samples, dest, destSkip );
  447. }
  448. #else
  449. // Fill a channel with zeros. This works even if Ty is not a basic type.
  450. template <typename Ty>
  451. void zero(int samples,
  452. Ty* dest,
  453. int destSkip = 0)
  454. {
  455. if (destSkip != 0)
  456. {
  457. ++destSkip;
  458. while (--samples >= 0)
  459. {
  460. *dest = Ty();
  461. dest += destSkip;
  462. }
  463. }
  464. else { std::fill(dest, dest + samples, Ty()); }
  465. }
  466. #endif
  467. // Fill a set of channels with zero.
  468. template <typename Ty>
  469. void zero(int channels,
  470. int samples,
  471. Ty* const* dest,
  472. int destSkip = 0) { for (int i = channels; --i >= 0;) zero(samples, dest[i], destSkip); }
  473. //------------------------------------------------------------------------------
  474. // Implementation of Brent's Method provided by
  475. // John D. Cook (http://www.johndcook.com/)
  476. // The return value of Minimize is the minimum of the function f.
  477. // The location where f takes its minimum is returned in the variable minLoc.
  478. // Notation and implementation based on Chapter 5 of Richard Brent's book
  479. // "Algorithms for Minimization Without Derivatives".
  480. //
  481. // Reference:
  482. // http://www.codeproject.com/KB/recipes/one_variable_optimize.aspx?msg=2779038
  483. template <class TFunction>
  484. double BrentMinimize(TFunction& f, // [in] objective function to minimize
  485. double leftEnd, // [in] smaller value of bracketing interval
  486. double rightEnd, // [in] larger value of bracketing interval
  487. double epsilon, // [in] stopping tolerance
  488. double& minLoc) // [out] location of minimum
  489. {
  490. double e, q, r, u, w, fw, fx;
  491. static const double c = 0.5 * (3.0 - std::sqrt(5.0));
  492. static const double SQRT_DBL_EPSILON = std::sqrt(DBL_EPSILON);
  493. double& a = leftEnd;
  494. double& b = rightEnd;
  495. double& x = minLoc;
  496. double v = w = x = a + c * (b - a);
  497. double d = e = 0.0;
  498. double fv = fw = fx = f(x);
  499. int counter = 0;
  500. loop:
  501. counter++;
  502. double m = 0.5 * (a + b);
  503. double tol = SQRT_DBL_EPSILON * fabs(x) + epsilon;
  504. double t2 = 2.0 * tol;
  505. // Check stopping criteria
  506. if (fabs(x - m) > t2 - 0.5 * (b - a))
  507. {
  508. double p = q = r = 0.0;
  509. if (fabs(e) > tol)
  510. {
  511. // fit parabola
  512. r = (x - w) * (fx - fv);
  513. q = (x - v) * (fx - fw);
  514. p = (x - v) * q - (x - w) * r;
  515. q = 2.0 * (q - r);
  516. (q > 0.0) ? p = -p : q = -q;
  517. r = e;
  518. e = d;
  519. }
  520. if (fabs(p) < fabs(0.5 * q * r) && p < q * (a - x) && p < q * (b - x))
  521. {
  522. // A parabolic interpolation step
  523. d = p / q;
  524. u = x + d;
  525. // f must not be evaluated too close to a or b
  526. if (u - a < t2 || b - u < t2) d = (x < m) ? tol : -tol;
  527. }
  528. else
  529. {
  530. // A golden section step
  531. e = (x < m) ? b : a;
  532. e -= x;
  533. d = c * e;
  534. }
  535. // f must not be evaluated too close to x
  536. if (fabs(d) >= tol) u = x + d;
  537. else if (d > 0.0) u = x + tol;
  538. else u = x - tol;
  539. double fu = f(u);
  540. // Update a, b, v, w, and x
  541. if (fu <= fx)
  542. {
  543. (u < x) ? b = x : a = x;
  544. v = w;
  545. fv = fw;
  546. w = x;
  547. fw = fx;
  548. x = u;
  549. fx = fu;
  550. }
  551. else
  552. {
  553. (u < x) ? a = u : b = u;
  554. if (fu <= fw || w == x)
  555. {
  556. v = w;
  557. fv = fw;
  558. w = u;
  559. fw = fu;
  560. }
  561. else if (fu <= fv || v == x || v == w)
  562. {
  563. v = u;
  564. fv = fu;
  565. }
  566. }
  567. goto loop; // Yes, the dreaded goto statement. But the code
  568. // here is faithful to Brent's orginal pseudocode.
  569. }
  570. return fx;
  571. }
  572. //------------------------------------------------------------------------------
  573. // Tracks the peaks in the signal stream using the attack and release parameters
  574. template <int Channels = 2, typename Value=float>
  575. class EnvelopeFollower
  576. {
  577. public:
  578. EnvelopeFollower() { for (int i = 0; i < Channels; ++i) m_env[i] = 0; }
  579. Value operator[](int channel) const { return m_env[channel]; }
  580. void Setup(int sampleRate, double attackMs, double releaseMs)
  581. {
  582. m_a = pow(0.01, 1.0 / (attackMs * sampleRate * 0.001));
  583. m_r = pow(0.01, 1.0 / (releaseMs * sampleRate * 0.001));
  584. }
  585. void Process(size_t samples, const Value** src)
  586. {
  587. for (int i = 0; i < Channels; ++i)
  588. {
  589. const Value* cur = src[i];
  590. double e = m_env[i];
  591. for (int n = samples; n; n--)
  592. {
  593. double v = std::abs(*cur++);
  594. if (v > e) e = m_a * (e - v) + v;
  595. else e = m_r * (e - v) + v;
  596. }
  597. m_env[i] = e;
  598. }
  599. }
  600. double m_env[Channels];
  601. protected:
  602. double m_a = 0;
  603. double m_r = 0;
  604. };
  605. //------------------------------------------------------------------------------
  606. // Helpful for discovering discontinuities in buffers
  607. template <int Channels = 2, typename Value=float>
  608. class SlopeDetector
  609. {
  610. public:
  611. SlopeDetector() : m_firstTime(true) { for (int i = 0; i < Channels; ++i) m_slope[i] = 0; }
  612. Value getSlope(int channel) const { return m_slope[channel]; }
  613. void process(size_t nSamples, const Value** input)
  614. {
  615. for (int i = 0; i < Channels; ++i)
  616. {
  617. const Value* src = input[i];
  618. int n = nSamples;
  619. if (m_firstTime)
  620. {
  621. m_prev[i] = *src++;
  622. --n;
  623. }
  624. while (n > 0)
  625. {
  626. n--;
  627. Value cur = *src++;
  628. Value diff = std::abs(cur - m_prev[i]);
  629. m_slope[i] = std::max(diff, m_slope[i]);
  630. m_prev[i] = cur;
  631. }
  632. }
  633. m_firstTime = false;
  634. }
  635. private:
  636. bool m_firstTime = false;
  637. Value m_slope [Channels];
  638. Value m_prev [Channels];
  639. };
  640. } // namespace Dsp
  641. #endif