Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
19daa4338c | |||
c695758618 | |||
c4826fe2b9 | |||
5ab9704b6f | |||
65d692d009 | |||
39e1afcf47 | |||
0a7a5e98ce | |||
e64756081b | |||
8d75111d97 | |||
0e031fc91d | |||
fda77fca56 |
373
LICENSE
Normal file
373
LICENSE
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
Mozilla Public License Version 2.0
|
||||||
|
==================================
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
--------------
|
||||||
|
|
||||||
|
1.1. "Contributor"
|
||||||
|
means each individual or legal entity that creates, contributes to
|
||||||
|
the creation of, or owns Covered Software.
|
||||||
|
|
||||||
|
1.2. "Contributor Version"
|
||||||
|
means the combination of the Contributions of others (if any) used
|
||||||
|
by a Contributor and that particular Contributor's Contribution.
|
||||||
|
|
||||||
|
1.3. "Contribution"
|
||||||
|
means Covered Software of a particular Contributor.
|
||||||
|
|
||||||
|
1.4. "Covered Software"
|
||||||
|
means Source Code Form to which the initial Contributor has attached
|
||||||
|
the notice in Exhibit A, the Executable Form of such Source Code
|
||||||
|
Form, and Modifications of such Source Code Form, in each case
|
||||||
|
including portions thereof.
|
||||||
|
|
||||||
|
1.5. "Incompatible With Secondary Licenses"
|
||||||
|
means
|
||||||
|
|
||||||
|
(a) that the initial Contributor has attached the notice described
|
||||||
|
in Exhibit B to the Covered Software; or
|
||||||
|
|
||||||
|
(b) that the Covered Software was made available under the terms of
|
||||||
|
version 1.1 or earlier of the License, but not also under the
|
||||||
|
terms of a Secondary License.
|
||||||
|
|
||||||
|
1.6. "Executable Form"
|
||||||
|
means any form of the work other than Source Code Form.
|
||||||
|
|
||||||
|
1.7. "Larger Work"
|
||||||
|
means a work that combines Covered Software with other material, in
|
||||||
|
a separate file or files, that is not Covered Software.
|
||||||
|
|
||||||
|
1.8. "License"
|
||||||
|
means this document.
|
||||||
|
|
||||||
|
1.9. "Licensable"
|
||||||
|
means having the right to grant, to the maximum extent possible,
|
||||||
|
whether at the time of the initial grant or subsequently, any and
|
||||||
|
all of the rights conveyed by this License.
|
||||||
|
|
||||||
|
1.10. "Modifications"
|
||||||
|
means any of the following:
|
||||||
|
|
||||||
|
(a) any file in Source Code Form that results from an addition to,
|
||||||
|
deletion from, or modification of the contents of Covered
|
||||||
|
Software; or
|
||||||
|
|
||||||
|
(b) any new file in Source Code Form that contains any Covered
|
||||||
|
Software.
|
||||||
|
|
||||||
|
1.11. "Patent Claims" of a Contributor
|
||||||
|
means any patent claim(s), including without limitation, method,
|
||||||
|
process, and apparatus claims, in any patent Licensable by such
|
||||||
|
Contributor that would be infringed, but for the grant of the
|
||||||
|
License, by the making, using, selling, offering for sale, having
|
||||||
|
made, import, or transfer of either its Contributions or its
|
||||||
|
Contributor Version.
|
||||||
|
|
||||||
|
1.12. "Secondary License"
|
||||||
|
means either the GNU General Public License, Version 2.0, the GNU
|
||||||
|
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||||
|
Public License, Version 3.0, or any later versions of those
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
1.13. "Source Code Form"
|
||||||
|
means the form of the work preferred for making modifications.
|
||||||
|
|
||||||
|
1.14. "You" (or "Your")
|
||||||
|
means an individual or a legal entity exercising rights under this
|
||||||
|
License. For legal entities, "You" includes any entity that
|
||||||
|
controls, is controlled by, or is under common control with You. For
|
||||||
|
purposes of this definition, "control" means (a) the power, direct
|
||||||
|
or indirect, to cause the direction or management of such entity,
|
||||||
|
whether by contract or otherwise, or (b) ownership of more than
|
||||||
|
fifty percent (50%) of the outstanding shares or beneficial
|
||||||
|
ownership of such entity.
|
||||||
|
|
||||||
|
2. License Grants and Conditions
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
2.1. Grants
|
||||||
|
|
||||||
|
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||||
|
non-exclusive license:
|
||||||
|
|
||||||
|
(a) under intellectual property rights (other than patent or trademark)
|
||||||
|
Licensable by such Contributor to use, reproduce, make available,
|
||||||
|
modify, display, perform, distribute, and otherwise exploit its
|
||||||
|
Contributions, either on an unmodified basis, with Modifications, or
|
||||||
|
as part of a Larger Work; and
|
||||||
|
|
||||||
|
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||||
|
for sale, have made, import, and otherwise transfer either its
|
||||||
|
Contributions or its Contributor Version.
|
||||||
|
|
||||||
|
2.2. Effective Date
|
||||||
|
|
||||||
|
The licenses granted in Section 2.1 with respect to any Contribution
|
||||||
|
become effective for each Contribution on the date the Contributor first
|
||||||
|
distributes such Contribution.
|
||||||
|
|
||||||
|
2.3. Limitations on Grant Scope
|
||||||
|
|
||||||
|
The licenses granted in this Section 2 are the only rights granted under
|
||||||
|
this License. No additional rights or licenses will be implied from the
|
||||||
|
distribution or licensing of Covered Software under this License.
|
||||||
|
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||||
|
Contributor:
|
||||||
|
|
||||||
|
(a) for any code that a Contributor has removed from Covered Software;
|
||||||
|
or
|
||||||
|
|
||||||
|
(b) for infringements caused by: (i) Your and any other third party's
|
||||||
|
modifications of Covered Software, or (ii) the combination of its
|
||||||
|
Contributions with other software (except as part of its Contributor
|
||||||
|
Version); or
|
||||||
|
|
||||||
|
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||||
|
its Contributions.
|
||||||
|
|
||||||
|
This License does not grant any rights in the trademarks, service marks,
|
||||||
|
or logos of any Contributor (except as may be necessary to comply with
|
||||||
|
the notice requirements in Section 3.4).
|
||||||
|
|
||||||
|
2.4. Subsequent Licenses
|
||||||
|
|
||||||
|
No Contributor makes additional grants as a result of Your choice to
|
||||||
|
distribute the Covered Software under a subsequent version of this
|
||||||
|
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||||
|
permitted under the terms of Section 3.3).
|
||||||
|
|
||||||
|
2.5. Representation
|
||||||
|
|
||||||
|
Each Contributor represents that the Contributor believes its
|
||||||
|
Contributions are its original creation(s) or it has sufficient rights
|
||||||
|
to grant the rights to its Contributions conveyed by this License.
|
||||||
|
|
||||||
|
2.6. Fair Use
|
||||||
|
|
||||||
|
This License is not intended to limit any rights You have under
|
||||||
|
applicable copyright doctrines of fair use, fair dealing, or other
|
||||||
|
equivalents.
|
||||||
|
|
||||||
|
2.7. Conditions
|
||||||
|
|
||||||
|
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||||
|
in Section 2.1.
|
||||||
|
|
||||||
|
3. Responsibilities
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
3.1. Distribution of Source Form
|
||||||
|
|
||||||
|
All distribution of Covered Software in Source Code Form, including any
|
||||||
|
Modifications that You create or to which You contribute, must be under
|
||||||
|
the terms of this License. You must inform recipients that the Source
|
||||||
|
Code Form of the Covered Software is governed by the terms of this
|
||||||
|
License, and how they can obtain a copy of this License. You may not
|
||||||
|
attempt to alter or restrict the recipients' rights in the Source Code
|
||||||
|
Form.
|
||||||
|
|
||||||
|
3.2. Distribution of Executable Form
|
||||||
|
|
||||||
|
If You distribute Covered Software in Executable Form then:
|
||||||
|
|
||||||
|
(a) such Covered Software must also be made available in Source Code
|
||||||
|
Form, as described in Section 3.1, and You must inform recipients of
|
||||||
|
the Executable Form how they can obtain a copy of such Source Code
|
||||||
|
Form by reasonable means in a timely manner, at a charge no more
|
||||||
|
than the cost of distribution to the recipient; and
|
||||||
|
|
||||||
|
(b) You may distribute such Executable Form under the terms of this
|
||||||
|
License, or sublicense it under different terms, provided that the
|
||||||
|
license for the Executable Form does not attempt to limit or alter
|
||||||
|
the recipients' rights in the Source Code Form under this License.
|
||||||
|
|
||||||
|
3.3. Distribution of a Larger Work
|
||||||
|
|
||||||
|
You may create and distribute a Larger Work under terms of Your choice,
|
||||||
|
provided that You also comply with the requirements of this License for
|
||||||
|
the Covered Software. If the Larger Work is a combination of Covered
|
||||||
|
Software with a work governed by one or more Secondary Licenses, and the
|
||||||
|
Covered Software is not Incompatible With Secondary Licenses, this
|
||||||
|
License permits You to additionally distribute such Covered Software
|
||||||
|
under the terms of such Secondary License(s), so that the recipient of
|
||||||
|
the Larger Work may, at their option, further distribute the Covered
|
||||||
|
Software under the terms of either this License or such Secondary
|
||||||
|
License(s).
|
||||||
|
|
||||||
|
3.4. Notices
|
||||||
|
|
||||||
|
You may not remove or alter the substance of any license notices
|
||||||
|
(including copyright notices, patent notices, disclaimers of warranty,
|
||||||
|
or limitations of liability) contained within the Source Code Form of
|
||||||
|
the Covered Software, except that You may alter any license notices to
|
||||||
|
the extent required to remedy known factual inaccuracies.
|
||||||
|
|
||||||
|
3.5. Application of Additional Terms
|
||||||
|
|
||||||
|
You may choose to offer, and to charge a fee for, warranty, support,
|
||||||
|
indemnity or liability obligations to one or more recipients of Covered
|
||||||
|
Software. However, You may do so only on Your own behalf, and not on
|
||||||
|
behalf of any Contributor. You must make it absolutely clear that any
|
||||||
|
such warranty, support, indemnity, or liability obligation is offered by
|
||||||
|
You alone, and You hereby agree to indemnify every Contributor for any
|
||||||
|
liability incurred by such Contributor as a result of warranty, support,
|
||||||
|
indemnity or liability terms You offer. You may include additional
|
||||||
|
disclaimers of warranty and limitations of liability specific to any
|
||||||
|
jurisdiction.
|
||||||
|
|
||||||
|
4. Inability to Comply Due to Statute or Regulation
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
If it is impossible for You to comply with any of the terms of this
|
||||||
|
License with respect to some or all of the Covered Software due to
|
||||||
|
statute, judicial order, or regulation then You must: (a) comply with
|
||||||
|
the terms of this License to the maximum extent possible; and (b)
|
||||||
|
describe the limitations and the code they affect. Such description must
|
||||||
|
be placed in a text file included with all distributions of the Covered
|
||||||
|
Software under this License. Except to the extent prohibited by statute
|
||||||
|
or regulation, such description must be sufficiently detailed for a
|
||||||
|
recipient of ordinary skill to be able to understand it.
|
||||||
|
|
||||||
|
5. Termination
|
||||||
|
--------------
|
||||||
|
|
||||||
|
5.1. The rights granted under this License will terminate automatically
|
||||||
|
if You fail to comply with any of its terms. However, if You become
|
||||||
|
compliant, then the rights granted under this License from a particular
|
||||||
|
Contributor are reinstated (a) provisionally, unless and until such
|
||||||
|
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||||
|
ongoing basis, if such Contributor fails to notify You of the
|
||||||
|
non-compliance by some reasonable means prior to 60 days after You have
|
||||||
|
come back into compliance. Moreover, Your grants from a particular
|
||||||
|
Contributor are reinstated on an ongoing basis if such Contributor
|
||||||
|
notifies You of the non-compliance by some reasonable means, this is the
|
||||||
|
first time You have received notice of non-compliance with this License
|
||||||
|
from such Contributor, and You become compliant prior to 30 days after
|
||||||
|
Your receipt of the notice.
|
||||||
|
|
||||||
|
5.2. If You initiate litigation against any entity by asserting a patent
|
||||||
|
infringement claim (excluding declaratory judgment actions,
|
||||||
|
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||||
|
directly or indirectly infringes any patent, then the rights granted to
|
||||||
|
You by any and all Contributors for the Covered Software under Section
|
||||||
|
2.1 of this License shall terminate.
|
||||||
|
|
||||||
|
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||||
|
end user license agreements (excluding distributors and resellers) which
|
||||||
|
have been validly granted by You or Your distributors under this License
|
||||||
|
prior to termination shall survive termination.
|
||||||
|
|
||||||
|
************************************************************************
|
||||||
|
* *
|
||||||
|
* 6. Disclaimer of Warranty *
|
||||||
|
* ------------------------- *
|
||||||
|
* *
|
||||||
|
* Covered Software is provided under this License on an "as is" *
|
||||||
|
* basis, without warranty of any kind, either expressed, implied, or *
|
||||||
|
* statutory, including, without limitation, warranties that the *
|
||||||
|
* Covered Software is free of defects, merchantable, fit for a *
|
||||||
|
* particular purpose or non-infringing. The entire risk as to the *
|
||||||
|
* quality and performance of the Covered Software is with You. *
|
||||||
|
* Should any Covered Software prove defective in any respect, You *
|
||||||
|
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||||
|
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||||
|
* essential part of this License. No use of any Covered Software is *
|
||||||
|
* authorized under this License except under this disclaimer. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
|
************************************************************************
|
||||||
|
* *
|
||||||
|
* 7. Limitation of Liability *
|
||||||
|
* -------------------------- *
|
||||||
|
* *
|
||||||
|
* Under no circumstances and under no legal theory, whether tort *
|
||||||
|
* (including negligence), contract, or otherwise, shall any *
|
||||||
|
* Contributor, or anyone who distributes Covered Software as *
|
||||||
|
* permitted above, be liable to You for any direct, indirect, *
|
||||||
|
* special, incidental, or consequential damages of any character *
|
||||||
|
* including, without limitation, damages for lost profits, loss of *
|
||||||
|
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||||
|
* and all other commercial damages or losses, even if such party *
|
||||||
|
* shall have been informed of the possibility of such damages. This *
|
||||||
|
* limitation of liability shall not apply to liability for death or *
|
||||||
|
* personal injury resulting from such party's negligence to the *
|
||||||
|
* extent applicable law prohibits such limitation. Some *
|
||||||
|
* jurisdictions do not allow the exclusion or limitation of *
|
||||||
|
* incidental or consequential damages, so this exclusion and *
|
||||||
|
* limitation may not apply to You. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
|
8. Litigation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Any litigation relating to this License may be brought only in the
|
||||||
|
courts of a jurisdiction where the defendant maintains its principal
|
||||||
|
place of business and such litigation shall be governed by laws of that
|
||||||
|
jurisdiction, without reference to its conflict-of-law provisions.
|
||||||
|
Nothing in this Section shall prevent a party's ability to bring
|
||||||
|
cross-claims or counter-claims.
|
||||||
|
|
||||||
|
9. Miscellaneous
|
||||||
|
----------------
|
||||||
|
|
||||||
|
This License represents the complete agreement concerning the subject
|
||||||
|
matter hereof. If any provision of this License is held to be
|
||||||
|
unenforceable, such provision shall be reformed only to the extent
|
||||||
|
necessary to make it enforceable. Any law or regulation which provides
|
||||||
|
that the language of a contract shall be construed against the drafter
|
||||||
|
shall not be used to construe this License against a Contributor.
|
||||||
|
|
||||||
|
10. Versions of the License
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
10.1. New Versions
|
||||||
|
|
||||||
|
Mozilla Foundation is the license steward. Except as provided in Section
|
||||||
|
10.3, no one other than the license steward has the right to modify or
|
||||||
|
publish new versions of this License. Each version will be given a
|
||||||
|
distinguishing version number.
|
||||||
|
|
||||||
|
10.2. Effect of New Versions
|
||||||
|
|
||||||
|
You may distribute the Covered Software under the terms of the version
|
||||||
|
of the License under which You originally received the Covered Software,
|
||||||
|
or under the terms of any subsequent version published by the license
|
||||||
|
steward.
|
||||||
|
|
||||||
|
10.3. Modified Versions
|
||||||
|
|
||||||
|
If you create software not governed by this License, and you want to
|
||||||
|
create a new license for such software, you may create and use a
|
||||||
|
modified version of this License if you rename the license and remove
|
||||||
|
any references to the name of the license steward (except to note that
|
||||||
|
such modified license differs from this License).
|
||||||
|
|
||||||
|
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||||
|
Licenses
|
||||||
|
|
||||||
|
If You choose to distribute Source Code Form that is Incompatible With
|
||||||
|
Secondary Licenses under the terms of this version of the License, the
|
||||||
|
notice described in Exhibit B of this License must be attached.
|
||||||
|
|
||||||
|
Exhibit A - Source Code Form License Notice
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular
|
||||||
|
file, then You may include the notice in a location (such as a LICENSE
|
||||||
|
file in a relevant directory) where a recipient would be likely to look
|
||||||
|
for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
||||||
|
|
||||||
|
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||||
|
defined by the Mozilla Public License, v. 2.0.
|
17
README.md
17
README.md
@ -2,3 +2,20 @@
|
|||||||
|
|
||||||
|
|
||||||
[](https://travis-ci.org/musicdsp/audio-algo-drain)
|
[](https://travis-ci.org/musicdsp/audio-algo-drain)
|
||||||
|
|
||||||
|
License (MPL v2.0)
|
||||||
|
=====================
|
||||||
|
Copyright ewolsa Edouard DUPIN
|
||||||
|
|
||||||
|
Licensed under the Mozilla Public License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.mozilla.org/MPL/2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ememory/memory.hpp>
|
#include <ememory/memory.hpp>
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
#include <audio/algo/drain/BiQuadType.hpp>
|
#include <audio/algo/drain/BiQuadType.hpp>
|
||||||
#include <cmath>
|
#include <etk/Pair.hpp>
|
||||||
|
extern "C" {
|
||||||
|
#include <math.h>
|
||||||
|
}
|
||||||
#ifndef M_LN10
|
#ifndef M_LN10
|
||||||
#define M_LN10 2.30258509299404568402
|
#define M_LN10 2.30258509299404568402
|
||||||
#endif
|
#endif
|
||||||
@ -63,8 +66,8 @@ namespace audio {
|
|||||||
_qualityFactor = 0.01;
|
_qualityFactor = 0.01;
|
||||||
}
|
}
|
||||||
double norm;
|
double norm;
|
||||||
double V = std::pow(10.0, std::abs(_gain) / 20.0);
|
double V = etk::pow(10.0, etk::abs(_gain) / 20.0);
|
||||||
double K = std::tan(M_PI * _frequencyCut / _sampleRate);
|
double K = etk::tan(M_PI * _frequencyCut / _sampleRate);
|
||||||
switch (_type) {
|
switch (_type) {
|
||||||
case biQuadType_none:
|
case biQuadType_none:
|
||||||
m_a[0] = 1.0;
|
m_a[0] = 1.0;
|
||||||
@ -125,35 +128,35 @@ namespace audio {
|
|||||||
case biQuadType_lowShelf:
|
case biQuadType_lowShelf:
|
||||||
if (_gain >= 0) {
|
if (_gain >= 0) {
|
||||||
norm = 1.0 / (1.0 + M_SQRT2 * K + K * K);
|
norm = 1.0 / (1.0 + M_SQRT2 * K + K * K);
|
||||||
m_a[0] = (1.0 + std::sqrt(2.0*V) * K + V * K * K) * norm;
|
m_a[0] = (1.0 + etk::sqrt(2.0*V) * K + V * K * K) * norm;
|
||||||
m_a[1] = 2.0 * (V * K * K - 1.0) * norm;
|
m_a[1] = 2.0 * (V * K * K - 1.0) * norm;
|
||||||
m_a[2] = (1.0 - std::sqrt(2.0*V) * K + V * K * K) * norm;
|
m_a[2] = (1.0 - etk::sqrt(2.0*V) * K + V * K * K) * norm;
|
||||||
m_b[0] = 2.0 * (K * K - 1.0) * norm;
|
m_b[0] = 2.0 * (K * K - 1.0) * norm;
|
||||||
m_b[1] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
m_b[1] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
||||||
} else {
|
} else {
|
||||||
norm = 1.0 / (1.0 + std::sqrt(2.0*V) * K + V * K * K);
|
norm = 1.0 / (1.0 + etk::sqrt(2.0*V) * K + V * K * K);
|
||||||
m_a[0] = (1.0 + M_SQRT2 * K + K * K) * norm;
|
m_a[0] = (1.0 + M_SQRT2 * K + K * K) * norm;
|
||||||
m_a[1] = 2.0 * (K * K - 1.0) * norm;
|
m_a[1] = 2.0 * (K * K - 1.0) * norm;
|
||||||
m_a[2] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
m_a[2] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
||||||
m_b[0] = 2.0 * (V * K * K - 1.0) * norm;
|
m_b[0] = 2.0 * (V * K * K - 1.0) * norm;
|
||||||
m_b[1] = (1.0 - std::sqrt(2.0*V) * K + V * K * K) * norm;
|
m_b[1] = (1.0 - etk::sqrt(2.0*V) * K + V * K * K) * norm;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case biQuadType_highShelf:
|
case biQuadType_highShelf:
|
||||||
if (_gain >= 0) {
|
if (_gain >= 0) {
|
||||||
norm = 1.0 / (1.0 + M_SQRT2 * K + K * K);
|
norm = 1.0 / (1.0 + M_SQRT2 * K + K * K);
|
||||||
m_a[0] = (V + std::sqrt(2.0*V) * K + K * K) * norm;
|
m_a[0] = (V + etk::sqrt(2.0*V) * K + K * K) * norm;
|
||||||
m_a[1] = 2.0 * (K * K - V) * norm;
|
m_a[1] = 2.0 * (K * K - V) * norm;
|
||||||
m_a[2] = (V - std::sqrt(2.0*V) * K + K * K) * norm;
|
m_a[2] = (V - etk::sqrt(2.0*V) * K + K * K) * norm;
|
||||||
m_b[0] = 2.0 * (K * K - 1.0) * norm;
|
m_b[0] = 2.0 * (K * K - 1.0) * norm;
|
||||||
m_b[1] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
m_b[1] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
||||||
} else {
|
} else {
|
||||||
norm = 1.0 / (V + std::sqrt(2.0*V) * K + K * K);
|
norm = 1.0 / (V + etk::sqrt(2.0*V) * K + K * K);
|
||||||
m_a[0] = (1.0 + M_SQRT2 * K + K * K) * norm;
|
m_a[0] = (1.0 + M_SQRT2 * K + K * K) * norm;
|
||||||
m_a[1] = 2.0 * (K * K - 1.0) * norm;
|
m_a[1] = 2.0 * (K * K - 1.0) * norm;
|
||||||
m_a[2] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
m_a[2] = (1.0 - M_SQRT2 * K + K * K) * norm;
|
||||||
m_b[0] = 2.0 * (K * K - V) * norm;
|
m_b[0] = 2.0 * (K * K - V) * norm;
|
||||||
m_b[1] = (V - std::sqrt(2.0*V) * K + K * K) * norm;
|
m_b[1] = (V - etk::sqrt(2.0*V) * K + K * K) * norm;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -182,13 +185,13 @@ namespace audio {
|
|||||||
/**
|
/**
|
||||||
* @brief Get direct Coefficients
|
* @brief Get direct Coefficients
|
||||||
*/
|
*/
|
||||||
std::vector<TYPE> getCoef() {
|
etk::Vector<TYPE> getCoef() {
|
||||||
std::vector<TYPE> out;
|
etk::Vector<TYPE> out;
|
||||||
out.push_back(m_a[0]);
|
out.pushBack(m_a[0]);
|
||||||
out.push_back(m_a[1]);
|
out.pushBack(m_a[1]);
|
||||||
out.push_back(m_a[2]);
|
out.pushBack(m_a[2]);
|
||||||
out.push_back(m_b[0]);
|
out.pushBack(m_b[0]);
|
||||||
out.push_back(m_b[1]);
|
out.pushBack(m_b[1]);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -249,8 +252,8 @@ namespace audio {
|
|||||||
* @param[in] _sampleRate input qample rate
|
* @param[in] _sampleRate input qample rate
|
||||||
* @retrun list of frequency/power in dB
|
* @retrun list of frequency/power in dB
|
||||||
*/
|
*/
|
||||||
std::vector<std::pair<float,float> > calculateTheory(double _sampleRate){
|
etk::Vector<etk::Pair<float,float> > calculateTheory(double _sampleRate){
|
||||||
std::vector<std::pair<float,float> > out;
|
etk::Vector<etk::Pair<float,float> > out;
|
||||||
double norm;
|
double norm;
|
||||||
bool buildLinear = true;
|
bool buildLinear = true;
|
||||||
size_t len = 512;
|
size_t len = 512;
|
||||||
@ -261,14 +264,14 @@ namespace audio {
|
|||||||
w = iii / (len - 1.0) * M_PI;
|
w = iii / (len - 1.0) * M_PI;
|
||||||
} else {
|
} else {
|
||||||
// 0.001 to 1, times pi, log scale
|
// 0.001 to 1, times pi, log scale
|
||||||
w = std::exp(std::log(1.0 / 0.001) * iii / (len - 1.0)) * 0.001 * M_PI;
|
w = etk::exp(etk::log(1.0 / 0.001) * iii / (len - 1.0)) * 0.001 * M_PI;
|
||||||
}
|
}
|
||||||
double freq = iii / (len - 1.0) * _sampleRate / 2.0;
|
double freq = iii / (len - 1.0) * _sampleRate / 2.0;
|
||||||
double phi = std::pow(std::sin(w/2.0), 2.0);
|
double phi = etk::pow(etk::sin(w/2.0), 2.0);
|
||||||
double y = std::log( std::pow((m_a[0]+m_a[1]+m_a[2]).getDouble(), 2.0)
|
double y = etk::log( etk::pow((m_a[0]+m_a[1]+m_a[2]).getDouble(), 2.0)
|
||||||
- 4.0*((m_a[0]*m_a[1]).getDouble() + 4.0*(m_a[0]*m_a[2]).getDouble() + (m_a[1]*m_a[2]).getDouble())*phi
|
- 4.0*((m_a[0]*m_a[1]).getDouble() + 4.0*(m_a[0]*m_a[2]).getDouble() + (m_a[1]*m_a[2]).getDouble())*phi
|
||||||
+ 16.0*(m_a[0]*m_a[2]).getDouble()*phi*phi)
|
+ 16.0*(m_a[0]*m_a[2]).getDouble()*phi*phi)
|
||||||
- std::log( std::pow(1.0+(m_b[0]+m_b[1]).getDouble(), 2.0)
|
- etk::log( etk::pow(1.0+(m_b[0]+m_b[1]).getDouble(), 2.0)
|
||||||
- 4.0*((m_b[0]).getDouble() + 4.0*(m_b[1]).getDouble() + (m_b[0]*m_b[1]).getDouble())*phi
|
- 4.0*((m_b[0]).getDouble() + 4.0*(m_b[1]).getDouble() + (m_b[0]*m_b[1]).getDouble())*phi
|
||||||
+ 16.0*m_b[1].getDouble()*phi*phi);
|
+ 16.0*m_b[1].getDouble()*phi*phi);
|
||||||
y = y * 10.0 / M_LN10;
|
y = y * 10.0 / M_LN10;
|
||||||
@ -276,7 +279,7 @@ namespace audio {
|
|||||||
y = -200.0;
|
y = -200.0;
|
||||||
}
|
}
|
||||||
//APPL_DEBUG("theory = " << freq << " power=" << y);
|
//APPL_DEBUG("theory = " << freq << " power=" << y);
|
||||||
out.push_back(std::make_pair<float,float>(freq, y));
|
out.pushBack(etk::makePair<float,float>(freq, y));
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
@ -22,10 +22,10 @@ static int32_t listValuesSize = sizeof(listValues)/sizeof(char*);
|
|||||||
|
|
||||||
|
|
||||||
namespace etk {
|
namespace etk {
|
||||||
template<> std::string to_string<enum audio::algo::drain::biQuadType>(const enum audio::algo::drain::biQuadType& _variable) {
|
template<> etk::String toString<enum audio::algo::drain::biQuadType>(const enum audio::algo::drain::biQuadType& _variable) {
|
||||||
return listValues[_variable];
|
return listValues[_variable];
|
||||||
}
|
}
|
||||||
template <> bool from_string<enum audio::algo::drain::biQuadType>(enum audio::algo::drain::biQuadType& _variableRet, const std::string& _value) {
|
template <> bool from_string<enum audio::algo::drain::biQuadType>(enum audio::algo::drain::biQuadType& _variableRet, const etk::String& _value) {
|
||||||
for (int32_t iii=0; iii<listValuesSize; ++iii) {
|
for (int32_t iii=0; iii<listValuesSize; ++iii) {
|
||||||
if (_value == listValues[iii]) {
|
if (_value == listValues[iii]) {
|
||||||
_variableRet = static_cast<enum audio::algo::drain::biQuadType>(iii);
|
_variableRet = static_cast<enum audio::algo::drain::biQuadType>(iii);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <audio/algo/drain/Equalizer.hpp>
|
#include <audio/algo/drain/Equalizer.hpp>
|
||||||
@ -74,11 +74,11 @@ namespace audio {
|
|||||||
virtual bool addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) = 0;
|
virtual bool addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) = 0;
|
||||||
public:
|
public:
|
||||||
// for debug & tools only
|
// for debug & tools only
|
||||||
virtual std::vector<std::pair<float,float> > calculateTheory() = 0;
|
virtual etk::Vector<etk::Pair<float,float> > calculateTheory() = 0;
|
||||||
};
|
};
|
||||||
template<typename TYPE> class EqualizerPrivateType : public audio::algo::drain::EqualizerPrivate {
|
template<typename TYPE> class EqualizerPrivateType : public audio::algo::drain::EqualizerPrivate {
|
||||||
protected:
|
protected:
|
||||||
std::vector<std::vector<audio::algo::drain::BiQuad<TYPE> > > m_biquads;
|
etk::Vector<etk::Vector<audio::algo::drain::BiQuad<TYPE> > > m_biquads;
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Constructor
|
* @brief Constructor
|
||||||
@ -122,7 +122,7 @@ namespace audio {
|
|||||||
bq.setBiquadCoef(_a0, _a1, _a2, _b0, _b1);
|
bq.setBiquadCoef(_a0, _a1, _a2, _b0, _b1);
|
||||||
// add this bequad for every Channel:
|
// add this bequad for every Channel:
|
||||||
for (size_t iii=0; iii<m_biquads.size(); ++iii) {
|
for (size_t iii=0; iii<m_biquads.size(); ++iii) {
|
||||||
m_biquads[iii].push_back(bq);
|
m_biquads[iii].pushBack(bq);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ namespace audio {
|
|||||||
bq.setBiquad(_type, _frequencyCut, _qualityFactor, _gain, m_sampleRate);
|
bq.setBiquad(_type, _frequencyCut, _qualityFactor, _gain, m_sampleRate);
|
||||||
// add this bequad for every Channel:
|
// add this bequad for every Channel:
|
||||||
for (size_t iii=0; iii<m_biquads.size(); ++iii) {
|
for (size_t iii=0; iii<m_biquads.size(); ++iii) {
|
||||||
m_biquads[iii].push_back(bq);
|
m_biquads[iii].pushBack(bq);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -139,7 +139,7 @@ namespace audio {
|
|||||||
audio::algo::drain::BiQuad<TYPE> bq;
|
audio::algo::drain::BiQuad<TYPE> bq;
|
||||||
bq.setBiquadCoef(_a0, _a1, _a2, _b0, _b1);
|
bq.setBiquadCoef(_a0, _a1, _a2, _b0, _b1);
|
||||||
if (_idChannel<m_biquads.size()) {
|
if (_idChannel<m_biquads.size()) {
|
||||||
m_biquads[_idChannel].push_back(bq);
|
m_biquads[_idChannel].pushBack(bq);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -147,17 +147,17 @@ namespace audio {
|
|||||||
audio::algo::drain::BiQuad<TYPE> bq;
|
audio::algo::drain::BiQuad<TYPE> bq;
|
||||||
bq.setBiquad(_type, _frequencyCut, _qualityFactor, _gain, m_sampleRate);
|
bq.setBiquad(_type, _frequencyCut, _qualityFactor, _gain, m_sampleRate);
|
||||||
if (_idChannel<m_biquads.size()) {
|
if (_idChannel<m_biquads.size()) {
|
||||||
m_biquads[_idChannel].push_back(bq);
|
m_biquads[_idChannel].pushBack(bq);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual std::vector<std::pair<float,float> > calculateTheory() {
|
virtual etk::Vector<etk::Pair<float,float> > calculateTheory() {
|
||||||
std::vector<std::pair<float,float> > out;
|
etk::Vector<etk::Pair<float,float> > out;
|
||||||
for (size_t iii=0; iii<m_biquads[0].size(); ++iii) {
|
for (size_t iii=0; iii<m_biquads[0].size(); ++iii) {
|
||||||
if (iii == 0) {
|
if (iii == 0) {
|
||||||
out = m_biquads[0][iii].calculateTheory(m_sampleRate);
|
out = m_biquads[0][iii].calculateTheory(m_sampleRate);
|
||||||
} else {
|
} else {
|
||||||
std::vector<std::pair<float,float> > tmp = m_biquads[0][iii].calculateTheory(m_sampleRate);
|
etk::Vector<etk::Pair<float,float> > tmp = m_biquads[0][iii].calculateTheory(m_sampleRate);
|
||||||
for (size_t jjj=0; jjj< out.size(); ++jjj) {
|
for (size_t jjj=0; jjj< out.size(); ++jjj) {
|
||||||
out[jjj].second += tmp[jjj].second;
|
out[jjj].second += tmp[jjj].second;
|
||||||
}
|
}
|
||||||
@ -186,7 +186,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_double:
|
case audio::format_double:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::double_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::double_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -196,7 +196,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_float:
|
case audio::format_float:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::float_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::float_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int8:
|
case audio::format_int8:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int8_8_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int8_8_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -216,7 +216,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int8_on_int16:
|
case audio::format_int8_on_int16:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int8_16_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int8_16_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -226,7 +226,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int16:
|
case audio::format_int16:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int16_16_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int16_16_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -236,7 +236,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int16_on_int32:
|
case audio::format_int16_on_int32:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int16_32_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int16_32_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -246,7 +246,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int24_on_int32:
|
case audio::format_int24_on_int32:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int24_32_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int24_32_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int32:
|
case audio::format_int32:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_32_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_32_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -266,7 +266,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int32_on_int64:
|
case audio::format_int32_on_int64:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_64_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_64_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -276,7 +276,7 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
case audio::format_int64:
|
case audio::format_int64:
|
||||||
{
|
{
|
||||||
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_64_t> >();
|
m_private = ememory::makeShared<EqualizerPrivateType<audio::int32_64_t> >();
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("can not allocate private data...");
|
AA_DRAIN_ERROR("can not allocate private data...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -286,27 +286,27 @@ void audio::algo::drain::Equalizer::init(float _sampleRate, int8_t _nbChannel, e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
void audio::algo::drain::Equalizer::reset() {
|
void audio::algo::drain::Equalizer::reset() {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_private->reset();
|
m_private->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<enum audio::format> audio::algo::drain::Equalizer::getSupportedFormat() {
|
etk::Vector<enum audio::format> audio::algo::drain::Equalizer::getSupportedFormat() {
|
||||||
std::vector<enum audio::format> out = audio::algo::drain::Equalizer::getNativeSupportedFormat();
|
etk::Vector<enum audio::format> out = audio::algo::drain::Equalizer::getNativeSupportedFormat();
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<enum audio::format> audio::algo::drain::Equalizer::getNativeSupportedFormat() {
|
etk::Vector<enum audio::format> audio::algo::drain::Equalizer::getNativeSupportedFormat() {
|
||||||
std::vector<enum audio::format> out;
|
etk::Vector<enum audio::format> out;
|
||||||
out.push_back(audio::format_float);
|
out.pushBack(audio::format_float);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio::algo::drain::Equalizer::process(void* _output, const void* _input, size_t _nbChunk) {
|
void audio::algo::drain::Equalizer::process(void* _output, const void* _input, size_t _nbChunk) {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -314,14 +314,14 @@ void audio::algo::drain::Equalizer::process(void* _output, const void* _input, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool audio::algo::drain::Equalizer::addBiquad(double _a0, double _a1, double _a2, double _b0, double _b1) {
|
bool audio::algo::drain::Equalizer::addBiquad(double _a0, double _a1, double _a2, double _b0, double _b1) {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return m_private->addBiquad(_a0, _a1, _a2, _b0, _b1);
|
return m_private->addBiquad(_a0, _a1, _a2, _b0, _b1);
|
||||||
}
|
}
|
||||||
bool audio::algo::drain::Equalizer::addBiquad(int32_t _idChannel, double _a0, double _a1, double _a2, double _b0, double _b1) {
|
bool audio::algo::drain::Equalizer::addBiquad(int32_t _idChannel, double _a0, double _a1, double _a2, double _b0, double _b1) {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -329,24 +329,24 @@ bool audio::algo::drain::Equalizer::addBiquad(int32_t _idChannel, double _a0, do
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool audio::algo::drain::Equalizer::addBiquad(audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) {
|
bool audio::algo::drain::Equalizer::addBiquad(audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return m_private->addBiquad(_type, _frequencyCut, _qualityFactor, _gain);
|
return m_private->addBiquad(_type, _frequencyCut, _qualityFactor, _gain);
|
||||||
}
|
}
|
||||||
bool audio::algo::drain::Equalizer::addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) {
|
bool audio::algo::drain::Equalizer::addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain) {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return m_private->addBiquad(_idChannel, _type, _frequencyCut, _qualityFactor, _gain);
|
return m_private->addBiquad(_idChannel, _type, _frequencyCut, _qualityFactor, _gain);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<float,float> > audio::algo::drain::Equalizer::calculateTheory() {
|
etk::Vector<etk::Pair<float,float> > audio::algo::drain::Equalizer::calculateTheory() {
|
||||||
if (m_private == nullptr) {
|
if (m_private == null) {
|
||||||
AA_DRAIN_ERROR("Equalizer does not init ...");
|
AA_DRAIN_ERROR("Equalizer does not init ...");
|
||||||
return std::vector<std::pair<float,float> >();
|
return etk::Vector<etk::Pair<float,float> >();
|
||||||
}
|
}
|
||||||
return m_private->calculateTheory();
|
return m_private->calculateTheory();
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
#include <etk/types.hpp>
|
||||||
#include <ememory/memory.hpp>
|
#include <ememory/memory.hpp>
|
||||||
#include <vector>
|
#include <etk/Vector.hpp>
|
||||||
#include <audio/format.hpp>
|
#include <audio/format.hpp>
|
||||||
#include <audio/algo/drain/BiQuadType.hpp>
|
#include <audio/algo/drain/BiQuadType.hpp>
|
||||||
|
#include <etk/Pair.hpp>
|
||||||
|
|
||||||
namespace audio {
|
namespace audio {
|
||||||
namespace algo {
|
namespace algo {
|
||||||
@ -41,12 +42,12 @@ namespace audio {
|
|||||||
* @brief Get list of format suported in input.
|
* @brief Get list of format suported in input.
|
||||||
* @return list of supported format
|
* @return list of supported format
|
||||||
*/
|
*/
|
||||||
virtual std::vector<enum audio::format> getSupportedFormat();
|
virtual etk::Vector<enum audio::format> getSupportedFormat();
|
||||||
/**
|
/**
|
||||||
* @brief Get list of algorithm format suported. No format convertion.
|
* @brief Get list of algorithm format suported. No format convertion.
|
||||||
* @return list of supported format
|
* @return list of supported format
|
||||||
*/
|
*/
|
||||||
virtual std::vector<enum audio::format> getNativeSupportedFormat();
|
virtual etk::Vector<enum audio::format> getNativeSupportedFormat();
|
||||||
/**
|
/**
|
||||||
* @brief Main input algo process.
|
* @brief Main input algo process.
|
||||||
* @param[in,out] _output Output data.
|
* @param[in,out] _output Output data.
|
||||||
@ -72,7 +73,7 @@ namespace audio {
|
|||||||
bool addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain);
|
bool addBiquad(int32_t _idChannel, audio::algo::drain::biQuadType _type, double _frequencyCut, double _qualityFactor, double _gain);
|
||||||
public:
|
public:
|
||||||
// for debug & tools only
|
// for debug & tools only
|
||||||
std::vector<std::pair<float,float> > calculateTheory();
|
etk::Vector<etk::Pair<float,float> > calculateTheory();
|
||||||
protected:
|
protected:
|
||||||
ememory::SharedPtr<EqualizerPrivate> m_private; //!< private data (abstract the type of the data flow).
|
ememory::SharedPtr<EqualizerPrivate> m_private; //!< private data (abstract the type of the data flow).
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "debug.hpp"
|
#include "debug.hpp"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import lutin.debug as debug
|
import realog.debug as debug
|
||||||
import lutin.tools as tools
|
import lutin.tools as tools
|
||||||
|
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ def get_desc():
|
|||||||
return "test drain audio algo"
|
return "test drain audio algo"
|
||||||
|
|
||||||
def get_licence():
|
def get_licence():
|
||||||
return "APACHE-2"
|
return "MPL-2"
|
||||||
|
|
||||||
def get_compagny_type():
|
def get_compagny_type():
|
||||||
return "com"
|
return "com"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import lutin.debug as debug
|
import realog.debug as debug
|
||||||
import lutin.tools as tools
|
import lutin.tools as tools
|
||||||
|
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ def get_desc():
|
|||||||
return "drain basic algorithm"
|
return "drain basic algorithm"
|
||||||
|
|
||||||
def get_licence():
|
def get_licence():
|
||||||
return "APACHE-2"
|
return "MPL-2"
|
||||||
|
|
||||||
|
|
||||||
def get_compagny_type():
|
def get_compagny_type():
|
||||||
|
@ -1,54 +1,54 @@
|
|||||||
/** @file
|
/** @file
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license APACHE v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <test-debug/debug.hpp>
|
#include <test-debug/debug.hpp>
|
||||||
#include <etk/etk.hpp>
|
#include <etk/etk.hpp>
|
||||||
#include <audio/algo/drain/Equalizer.hpp>
|
#include <audio/algo/drain/Equalizer.hpp>
|
||||||
#include <etk/os/FSNode.hpp>
|
#include <echrono/echrono.hpp>
|
||||||
#include <chrono>
|
#include <ethread/Thread.hpp>
|
||||||
#include <thread>
|
#include <ethread/tools.hpp>
|
||||||
|
#include <echrono/Steady.hpp>
|
||||||
|
#include <echrono/Duration.hpp>
|
||||||
|
|
||||||
class Performance {
|
class Performance {
|
||||||
private:
|
private:
|
||||||
std::chrono::steady_clock::time_point m_timeStart;
|
echrono::Steady m_timeStart;
|
||||||
std::chrono::steady_clock::time_point m_timeStop;
|
echrono::Steady m_timeStop;
|
||||||
std::chrono::nanoseconds m_totalTimeProcessing;
|
echrono::Duration m_totalTimeProcessing;
|
||||||
std::chrono::nanoseconds m_minProcessing;
|
echrono::Duration m_minProcessing;
|
||||||
std::chrono::nanoseconds m_maxProcessing;
|
echrono::Duration m_maxProcessing;
|
||||||
int32_t m_totalIteration;
|
int32_t m_totalIteration;
|
||||||
public:
|
public:
|
||||||
Performance() :
|
Performance() :
|
||||||
m_totalTimeProcessing(0),
|
m_totalTimeProcessing(echrono::nanoseconds(0)),
|
||||||
m_minProcessing(99999999999999LL),
|
m_minProcessing(echrono::nanoseconds(99999999999999LL)),
|
||||||
m_maxProcessing(0),
|
m_maxProcessing(echrono::nanoseconds(0)),
|
||||||
m_totalIteration(0) {
|
m_totalIteration(0) {
|
||||||
|
|
||||||
}
|
}
|
||||||
void tic() {
|
void tic() {
|
||||||
m_timeStart = std::chrono::steady_clock::now();
|
m_timeStart = echrono::Steady::now();
|
||||||
}
|
}
|
||||||
void toc() {
|
void toc() {
|
||||||
m_timeStop = std::chrono::steady_clock::now();
|
m_timeStop = echrono::Steady::now();
|
||||||
std::chrono::nanoseconds time = m_timeStop - m_timeStart;
|
echrono::Duration time = m_timeStop - m_timeStart;
|
||||||
m_minProcessing = std::min(m_minProcessing, time);
|
m_minProcessing = etk::min(m_minProcessing, time);
|
||||||
m_maxProcessing = std::max(m_maxProcessing, time);
|
m_maxProcessing = etk::max(m_maxProcessing, time);
|
||||||
m_totalTimeProcessing += time;
|
m_totalTimeProcessing += time;
|
||||||
m_totalIteration++;
|
m_totalIteration++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::nanoseconds getTotalTimeProcessing() {
|
echrono::Duration getTotalTimeProcessing() {
|
||||||
return m_totalTimeProcessing;
|
return m_totalTimeProcessing;
|
||||||
}
|
}
|
||||||
std::chrono::nanoseconds getMinProcessing() {
|
echrono::Duration getMinProcessing() {
|
||||||
return m_minProcessing;
|
return m_minProcessing;
|
||||||
}
|
}
|
||||||
std::chrono::nanoseconds getMaxProcessing() {
|
echrono::Duration getMaxProcessing() {
|
||||||
return m_maxProcessing;
|
return m_maxProcessing;
|
||||||
}
|
}
|
||||||
int32_t getTotalIteration() {
|
int32_t getTotalIteration() {
|
||||||
@ -58,9 +58,9 @@ class Performance {
|
|||||||
};
|
};
|
||||||
|
|
||||||
float performanceEqualizerType(audio::format _type) {
|
float performanceEqualizerType(audio::format _type) {
|
||||||
std::vector<float> input;
|
etk::Vector<float> input;
|
||||||
input.resize(1024, 0);
|
input.resize(1024, 0);
|
||||||
std::vector<float> output;
|
etk::Vector<float> output;
|
||||||
output.resize(input.size()*10, 0);
|
output.resize(input.size()*10, 0);
|
||||||
double sampleRate = 48000;
|
double sampleRate = 48000;
|
||||||
{
|
{
|
||||||
@ -87,16 +87,16 @@ float performanceEqualizerType(audio::format _type) {
|
|||||||
size_t sizeOut = output.size();
|
size_t sizeOut = output.size();
|
||||||
algo.process(&output[0], &input[0], input.size());
|
algo.process(&output[0], &input[0], input.size());
|
||||||
perfo.toc();
|
perfo.toc();
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
ethread::sleepMilliSeconds((1));
|
||||||
}
|
}
|
||||||
TEST_INFO(" blockSize=" << input.size() << " sample");
|
TEST_INFO(" blockSize=" << input.size() << " sample");
|
||||||
TEST_INFO(" min < avg < max =" << perfo.getMinProcessing().count() << "ns < "
|
TEST_INFO(" min < avg < max =" << perfo.getMinProcessing() << " < "
|
||||||
<< perfo.getTotalTimeProcessing().count()/perfo.getTotalIteration() << "ns < "
|
<< perfo.getTotalTimeProcessing().toSeconds()*1000000000.0/perfo.getTotalIteration() << "ns < "
|
||||||
<< perfo.getMaxProcessing().count() << "ns ");
|
<< perfo.getMaxProcessing());
|
||||||
float avg = (float(((perfo.getTotalTimeProcessing().count()/perfo.getTotalIteration())*sampleRate)/double(input.size()))/1000000000.0)*100.0;
|
float avg = (float(((perfo.getTotalTimeProcessing().toSeconds()*1000000000.0/perfo.getTotalIteration())*sampleRate)/double(input.size()))/1000000000.0)*100.0;
|
||||||
TEST_INFO(" min < avg < max= " << (float((perfo.getMinProcessing().count()*sampleRate)/double(input.size()))/1000000000.0)*100.0 << "% < "
|
TEST_INFO(" min < avg < max= " << (float((perfo.getMinProcessing().toSeconds()*1000000000.0*sampleRate)/double(input.size()))/1000000000.0)*100.0 << "% < "
|
||||||
<< avg << "% < "
|
<< avg << "% < "
|
||||||
<< (float((perfo.getMaxProcessing().count()*sampleRate)/double(input.size()))/1000000000.0)*100.0 << "%");
|
<< (float((perfo.getMaxProcessing().toSeconds()*1000000000.0*sampleRate)/double(input.size()))/1000000000.0)*100.0 << "%");
|
||||||
TEST_PRINT("type=" << _type << ": " << avg << "%");
|
TEST_PRINT("type=" << _type << ": " << avg << "%");
|
||||||
return avg;
|
return avg;
|
||||||
}
|
}
|
||||||
@ -116,17 +116,17 @@ void performanceEqualizer() {
|
|||||||
int main(int _argc, const char** _argv) {
|
int main(int _argc, const char** _argv) {
|
||||||
// the only one init for etk:
|
// the only one init for etk:
|
||||||
etk::init(_argc, _argv);
|
etk::init(_argc, _argv);
|
||||||
std::string inputName = "";
|
etk::String inputName = "";
|
||||||
std::string outputName = "output.raw";
|
etk::String outputName = "output.raw";
|
||||||
bool performance = false;
|
bool performance = false;
|
||||||
bool perf = false;
|
bool perf = false;
|
||||||
int64_t sampleRateIn = 48000;
|
int64_t sampleRateIn = 48000;
|
||||||
int64_t sampleRateOut = 48000;
|
int64_t sampleRateOut = 48000;
|
||||||
int32_t nbChan = 1;
|
int32_t nbChan = 1;
|
||||||
int32_t quality = 4;
|
int32_t quality = 4;
|
||||||
std::string test = "";
|
etk::String test = "";
|
||||||
for (int32_t iii=0; iii<_argc ; ++iii) {
|
for (int32_t iii=0; iii<_argc ; ++iii) {
|
||||||
std::string data = _argv[iii];
|
etk::String data = _argv[iii];
|
||||||
if (etk::start_with(data,"--in=")) {
|
if (etk::start_with(data,"--in=")) {
|
||||||
inputName = &data[5];
|
inputName = &data[5];
|
||||||
} else if (etk::start_with(data,"--out=")) {
|
} else if (etk::start_with(data,"--out=")) {
|
||||||
@ -178,10 +178,10 @@ int main(int _argc, const char** _argv) {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
TEST_INFO("Read input:");
|
TEST_INFO("Read input:");
|
||||||
std::vector<int16_t> inputData = etk::FSNodeReadAllDataType<int16_t>(inputName);
|
etk::Vector<int16_t> inputData = etk::FSNodeReadAllDataType<int16_t>(inputName);
|
||||||
TEST_INFO(" " << inputData.size() << " samples");
|
TEST_INFO(" " << inputData.size() << " samples");
|
||||||
// resize output :
|
// resize output :
|
||||||
std::vector<int16_t> output;
|
etk::Vector<int16_t> output;
|
||||||
output.resize(inputData.size()*sampleRateOut/sampleRateIn+5000, 0);
|
output.resize(inputData.size()*sampleRateOut/sampleRateIn+5000, 0);
|
||||||
// process in chunk of 256 samples
|
// process in chunk of 256 samples
|
||||||
int32_t blockSize = 256*nbChan;
|
int32_t blockSize = 256*nbChan;
|
||||||
@ -203,7 +203,7 @@ int main(int _argc, const char** _argv) {
|
|||||||
algo.process(&output[outputPosition], availlableSize, &inputData[iii*blockSize], blockSize, audio::format_int16);
|
algo.process(&output[outputPosition], availlableSize, &inputData[iii*blockSize], blockSize, audio::format_int16);
|
||||||
if (perf == true) {
|
if (perf == true) {
|
||||||
perfo.toc();
|
perfo.toc();
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
ethread::sleepMilliSeconds((1));
|
||||||
}
|
}
|
||||||
outputPosition += availlableSize*nbChan;
|
outputPosition += availlableSize*nbChan;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#include <cstdio>
|
|
||||||
#include <cmath>
|
extern "C" {
|
||||||
#include <cstdint>
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
}
|
||||||
// http://www.labbookpages.co.uk/audio/beamforming/delaySum.html
|
// http://www.labbookpages.co.uk/audio/beamforming/delaySum.html
|
||||||
// Number of angle points to calculate
|
// Number of angle points to calculate
|
||||||
#define ANGLE_RESOLUTION 100000
|
#define ANGLE_RESOLUTION 100000
|
||||||
@ -8,9 +11,8 @@
|
|||||||
|
|
||||||
#include <etk/etk.hpp>
|
#include <etk/etk.hpp>
|
||||||
#include <test-debug/debug.hpp>
|
#include <test-debug/debug.hpp>
|
||||||
#include <etk/os/FSNode.hpp>
|
|
||||||
#include <etk/math/Vector3D.hpp>
|
#include <etk/math/Vector3D.hpp>
|
||||||
#include <etk/math/Matrix4.hpp>
|
#include <etk/uri/uri.hpp>
|
||||||
|
|
||||||
const double speedSound = 340.29; // m/s
|
const double speedSound = 340.29; // m/s
|
||||||
|
|
||||||
@ -153,12 +155,12 @@ const double distanceEar = 3;
|
|||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
etk::init(argc, argv);
|
etk::init(argc, argv);
|
||||||
TEST_INFO("start calculation");
|
TEST_INFO("start calculation");
|
||||||
etk::FSNode node("beamPattern.dat");
|
ememory::SharedPtr<etk::io::Interface> fileIO = etk::uri::get(etk::Path("beamPattern.dat"));
|
||||||
node.fileOpenWrite();
|
if (fileIO->open(etk::io::OpenMode::Write) == false) {
|
||||||
|
TEST_ERROR("Can not open file...");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
double freq = 3000.0; // Signal frequency in Hz
|
double freq = 3000.0; // Signal frequency in Hz
|
||||||
|
|
||||||
|
|
||||||
double basicApplyDelay[posCount];
|
double basicApplyDelay[posCount];
|
||||||
for (int32_t iii=0; iii<posCount; iii++) {
|
for (int32_t iii=0; iii<posCount; iii++) {
|
||||||
basicApplyDelay[iii] = 0.0f;
|
basicApplyDelay[iii] = 0.0f;
|
||||||
@ -187,9 +189,9 @@ int main(int argc, const char *argv[]) {
|
|||||||
}
|
}
|
||||||
char ploppp[4096];
|
char ploppp[4096];
|
||||||
sprintf(ploppp, "%d %f %f %f %f\n", aaa, angle, angleRad, output, logOutput);
|
sprintf(ploppp, "%d %f %f %f %f\n", aaa, angle, angleRad, output, logOutput);
|
||||||
node.filePuts(ploppp);
|
fileIO->puts(ploppp);
|
||||||
}
|
}
|
||||||
node.fileClose();
|
fileIO->close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include <cstdio>
|
extern "C" {
|
||||||
#include <cmath>
|
#include <stdio.h>
|
||||||
#include <cstdint>
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
}
|
||||||
// http://www.labbookpages.co.uk/audio/beamforming/delaySum.html
|
// http://www.labbookpages.co.uk/audio/beamforming/delaySum.html
|
||||||
|
|
||||||
// Number of freq points to calculate
|
// Number of freq points to calculate
|
||||||
@ -13,10 +15,9 @@
|
|||||||
// gnuplot> call 'freqResp.gnuplot'
|
// gnuplot> call 'freqResp.gnuplot'
|
||||||
|
|
||||||
#include <etk/etk.hpp>
|
#include <etk/etk.hpp>
|
||||||
|
#include <etk/uri/uri.hpp>
|
||||||
#include <test-debug/debug.hpp>
|
#include <test-debug/debug.hpp>
|
||||||
#include <etk/os/FSNode.hpp>
|
|
||||||
#include <etk/math/Vector3D.hpp>
|
#include <etk/math/Vector3D.hpp>
|
||||||
#include <etk/math/Matrix4.hpp>
|
|
||||||
|
|
||||||
const double speedSound = 340.29; // m/s
|
const double speedSound = 340.29; // m/s
|
||||||
|
|
||||||
@ -153,8 +154,11 @@ const double distanceEar = 3;
|
|||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
etk::init(argc, argv);
|
etk::init(argc, argv);
|
||||||
TEST_INFO("start calculation");
|
TEST_INFO("start calculation");
|
||||||
etk::FSNode node("freqResp.dat");
|
ememory::SharedPtr<etk::io::Interface> fileIO = etk::uri::get(etk::Path("freqResp.dat"));
|
||||||
node.fileOpenWrite();
|
if (fileIO->open(etk::io::OpenMode::Write) == false) {
|
||||||
|
TEST_ERROR("Can not open file...");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
double basicApplyDelay[posCount];
|
double basicApplyDelay[posCount];
|
||||||
for (int32_t iii=0; iii<posCount; iii++) {
|
for (int32_t iii=0; iii<posCount; iii++) {
|
||||||
basicApplyDelay[iii] = 0.0f;
|
basicApplyDelay[iii] = 0.0f;
|
||||||
@ -185,10 +189,10 @@ int main(int argc, const char *argv[]) {
|
|||||||
}
|
}
|
||||||
char ploppp[4096];
|
char ploppp[4096];
|
||||||
sprintf(ploppp, "%f %f %f\n", angle, freq, logOutput);
|
sprintf(ploppp, "%f %f %f\n", angle, freq, logOutput);
|
||||||
node.filePuts(ploppp);
|
fileIO->puts(ploppp);
|
||||||
}
|
}
|
||||||
node.filePuts("\n");
|
fileIO->puts("\n");
|
||||||
}
|
}
|
||||||
node.fileClose();
|
fileIO->close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import lutin.debug as debug
|
import realog.debug as debug
|
||||||
import lutin.tools as tools
|
import lutin.tools as tools
|
||||||
|
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ def get_desc():
|
|||||||
return "audio algo drain tools"
|
return "audio algo drain tools"
|
||||||
|
|
||||||
def get_licence():
|
def get_licence():
|
||||||
return "APACHE-2"
|
return "MPL-2"
|
||||||
|
|
||||||
def get_compagny_type():
|
def get_compagny_type():
|
||||||
return "com"
|
return "com"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import lutin.debug as debug
|
import realog.debug as debug
|
||||||
import lutin.tools as tools
|
import lutin.tools as tools
|
||||||
|
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ def get_desc():
|
|||||||
return "audio algo drain tools"
|
return "audio algo drain tools"
|
||||||
|
|
||||||
def get_licence():
|
def get_licence():
|
||||||
return "APACHE-2"
|
return "MPL-2"
|
||||||
|
|
||||||
def get_compagny_type():
|
def get_compagny_type():
|
||||||
return "com"
|
return "com"
|
||||||
|
@ -1 +1 @@
|
|||||||
0.2.0
|
1.0.0
|
Loading…
x
Reference in New Issue
Block a user