mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-05-10 17:43:59 +00:00
Working codec2 support
This commit is contained in:
parent
549b2356d6
commit
62b55523c2
@ -16,7 +16,7 @@ done
|
|||||||
BASEDIR=`pwd`;
|
BASEDIR=`pwd`;
|
||||||
LIBDIR=${BASEDIR}/libs;
|
LIBDIR=${BASEDIR}/libs;
|
||||||
SUBDIRS="ilbc curl iksemel js js/nsprpub libdingaling libedit libsndfile pcre sofia-sip \
|
SUBDIRS="ilbc curl iksemel js js/nsprpub libdingaling libedit libsndfile pcre sofia-sip \
|
||||||
speex sqlite srtp openzap freetdm spandsp libg722_1 portaudio unimrcp tiff-3.8.2 broadvoice silk";
|
speex sqlite srtp openzap freetdm spandsp libg722_1 portaudio unimrcp tiff-3.8.2 broadvoice silk libcodec2";
|
||||||
|
|
||||||
if [ ! -f modules.conf ]; then
|
if [ ! -f modules.conf ]; then
|
||||||
cp build/modules.conf.in modules.conf
|
cp build/modules.conf.in modules.conf
|
||||||
|
@ -998,6 +998,7 @@ AC_CONFIG_SUBDIRS([libs/spandsp])
|
|||||||
AC_CONFIG_SUBDIRS([libs/broadvoice])
|
AC_CONFIG_SUBDIRS([libs/broadvoice])
|
||||||
AC_CONFIG_SUBDIRS([libs/libg722_1])
|
AC_CONFIG_SUBDIRS([libs/libg722_1])
|
||||||
AC_CONFIG_SUBDIRS([libs/silk])
|
AC_CONFIG_SUBDIRS([libs/silk])
|
||||||
|
AC_CONFIG_SUBDIRS([libs/libcodec2])
|
||||||
|
|
||||||
case $host in
|
case $host in
|
||||||
*-openbsd*)
|
*-openbsd*)
|
||||||
|
0
libs/libcodec2/.update
Normal file
0
libs/libcodec2/.update
Normal file
0
libs/libcodec2/AUTHORS
Normal file
0
libs/libcodec2/AUTHORS
Normal file
502
libs/libcodec2/COPYING
Normal file
502
libs/libcodec2/COPYING
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms of the
|
||||||
|
ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library. It is
|
||||||
|
safest to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least the
|
||||||
|
"copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1990
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
0
libs/libcodec2/ChangeLog
Normal file
0
libs/libcodec2/ChangeLog
Normal file
236
libs/libcodec2/INSTALL
Normal file
236
libs/libcodec2/INSTALL
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
|
||||||
|
Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is free documentation; the Free Software Foundation gives
|
||||||
|
unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. (Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.)
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You only need
|
||||||
|
`configure.ac' if you want to change it or regenerate `configure' using
|
||||||
|
a newer version of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system. If you're
|
||||||
|
using `csh' on an old version of System V, you might need to type
|
||||||
|
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||||
|
`configure' itself.
|
||||||
|
|
||||||
|
Running `configure' takes awhile. While running, it prints some
|
||||||
|
messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
5. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that the
|
||||||
|
`configure' script does not know about. Run `./configure --help' for
|
||||||
|
details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you must use a version of `make' that
|
||||||
|
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'.
|
||||||
|
|
||||||
|
If you have to use a `make' that does not support the `VPATH'
|
||||||
|
variable, you have to compile the package for one architecture at a
|
||||||
|
time in the source code directory. After you have installed the
|
||||||
|
package for one architecture, use `make distclean' before reconfiguring
|
||||||
|
for another architecture.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX'.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
|
you can set and what kinds of files go in them.
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out automatically,
|
||||||
|
but needs to determine by the type of machine the package will run on.
|
||||||
|
Usually, assuming the package is built to be run on the _same_
|
||||||
|
architectures, `configure' can figure that out, but if it prints a
|
||||||
|
message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS KERNEL-OS
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share, you
|
||||||
|
can create a site shell script called `config.site' that gives default
|
||||||
|
values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script). Here is a another example:
|
||||||
|
|
||||||
|
/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
|
||||||
|
configuration-related scripts to be executed by `/bin/bash'.
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
||||||
|
|
98
libs/libcodec2/Makefile.am
Normal file
98
libs/libcodec2/Makefile.am
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
AM_CFLAGS = -Isrc -Wall -lm
|
||||||
|
AUTOMAKE_OPTS = gnu
|
||||||
|
NAME = libcodec2
|
||||||
|
AM_CPPFLAGS = $(AM_CFLAGS)
|
||||||
|
|
||||||
|
EXTRA_DIST = pitch/hts1a.p \
|
||||||
|
pitch/hts2a.p \
|
||||||
|
octave/glottal.m \
|
||||||
|
octave/lsp_pdf.m \
|
||||||
|
octave/phase.m \
|
||||||
|
octave/pl2.m \
|
||||||
|
octave/plinterp.m \
|
||||||
|
octave/plnlp.m \
|
||||||
|
octave/plpitch.m \
|
||||||
|
octave/postfilter.m \
|
||||||
|
octave/load_raw.m \
|
||||||
|
octave/phase2.m \
|
||||||
|
octave/pitch_test.m \
|
||||||
|
octave/plamp.m \
|
||||||
|
octave/pl.m \
|
||||||
|
octave/plphase.m \
|
||||||
|
octave/png.m \
|
||||||
|
octave/pulse.m \
|
||||||
|
raw/b0067.raw \
|
||||||
|
raw/forig_speex_8k.raw \
|
||||||
|
raw/hts1.raw \
|
||||||
|
raw/hts2.raw \
|
||||||
|
raw/mmt1.raw \
|
||||||
|
raw/morig_speex_8k.raw \
|
||||||
|
raw/f2400.raw \
|
||||||
|
raw/hts1a_g729a.raw \
|
||||||
|
raw/hts2a_g729a.raw \
|
||||||
|
raw/hts.raw \
|
||||||
|
raw/mmt1_speex_8k.raw \
|
||||||
|
raw/forig_g729a.raw \
|
||||||
|
raw/hts1a_gsm13k.raw \
|
||||||
|
raw/hts2a_gsm13k.raw \
|
||||||
|
raw/m2400.raw \
|
||||||
|
raw/morig_g729a.raw \
|
||||||
|
raw/forig_gsm13k.raw \
|
||||||
|
raw/hts1a.raw \
|
||||||
|
raw/hts2a.raw \
|
||||||
|
raw/mmt1_g729a.raw \
|
||||||
|
raw/morig_gsm13k.raw \
|
||||||
|
raw/forig.raw \
|
||||||
|
raw/hts1a_speex_8k.raw \
|
||||||
|
raw/hts2a_speex_8k.raw \
|
||||||
|
raw/mmt1_gsm13k.raw \
|
||||||
|
raw/morig.raw \
|
||||||
|
script/menu.sh \
|
||||||
|
script/playraw.sh \
|
||||||
|
script/raw2wav.sh \
|
||||||
|
script/wav2raw.sh \
|
||||||
|
wav/f2400.wav \
|
||||||
|
wav/hts1a_c2_v0.1.wav \
|
||||||
|
wav/hts1a.wav \
|
||||||
|
wav/hts2a_speex_8k.wav \
|
||||||
|
wav/mmt1_speex_8k.wav \
|
||||||
|
wav/morig.wav \
|
||||||
|
wav/forig_speex_8k.wav \
|
||||||
|
wav/hts1a_g729a.wav \
|
||||||
|
wav/hts2a_c2_v0.1.wav \
|
||||||
|
wav/hts2a.wav \
|
||||||
|
wav/mmt1.wav \
|
||||||
|
wav/forig.wav \
|
||||||
|
wav/hts1a_speex_8k.wav \
|
||||||
|
wav/hts2a_g729a.wav \
|
||||||
|
wav/m2400.wav \
|
||||||
|
wav/morig_speex_8k.wav \
|
||||||
|
src/globals.c \
|
||||||
|
doc/A_m.gif \
|
||||||
|
doc/omega_0.gif \
|
||||||
|
doc/phi_m.gif \
|
||||||
|
doc/s_n.gif \
|
||||||
|
doc/s_n.txt \
|
||||||
|
unittest/lsp2.txt \
|
||||||
|
unittest/lsp7.txt \
|
||||||
|
unittest/lspd78.txt \
|
||||||
|
unittest/lsp3.txt \
|
||||||
|
unittest/lsp8.txt \
|
||||||
|
unittest/lspd910.txt \
|
||||||
|
unittest/lsp4.txt \
|
||||||
|
unittest/lsp9.txt \
|
||||||
|
unittest/lsp10.txt \
|
||||||
|
unittest/lsp5.txt \
|
||||||
|
unittest/lspd123.txt \
|
||||||
|
unittest/lsp1.txt \
|
||||||
|
unittest/lsp6.txt \
|
||||||
|
unittest/lspd456.txt \
|
||||||
|
src/codeall.sh \
|
||||||
|
src/fq20.sh \
|
||||||
|
src/listen1.sh \
|
||||||
|
src/listen.sh \
|
||||||
|
src/listensim.sh \
|
||||||
|
src/sim.sh
|
||||||
|
|
||||||
|
|
||||||
|
SUBDIRS = src unittest
|
690
libs/libcodec2/Makefile.in
Normal file
690
libs/libcodec2/Makefile.in
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
# Makefile.in generated by automake 1.9.6 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
top_builddir = .
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \
|
||||||
|
ChangeLog INSTALL NEWS compile config.guess config.sub depcomp \
|
||||||
|
install-sh ltmain.sh missing
|
||||||
|
subdir = .
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno configure.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
||||||
|
html-recursive info-recursive install-data-recursive \
|
||||||
|
install-exec-recursive install-info-recursive \
|
||||||
|
install-recursive installcheck-recursive installdirs-recursive \
|
||||||
|
pdf-recursive ps-recursive uninstall-info-recursive \
|
||||||
|
uninstall-recursive
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
{ test ! -d $(distdir) \
|
||||||
|
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -fr $(distdir); }; }
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMDEP_FALSE = @AMDEP_FALSE@
|
||||||
|
AMDEP_TRUE = @AMDEP_TRUE@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO = @ECHO@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
F77 = @F77@
|
||||||
|
FFLAGS = @FFLAGS@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_F77 = @ac_ct_F77@
|
||||||
|
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||||
|
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||||
|
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||||
|
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
AM_CFLAGS = -Isrc -Wall -lm
|
||||||
|
AUTOMAKE_OPTS = gnu
|
||||||
|
NAME = libcodec2
|
||||||
|
AM_CPPFLAGS = $(AM_CFLAGS)
|
||||||
|
EXTRA_DIST = pitch/hts1a.p \
|
||||||
|
pitch/hts2a.p \
|
||||||
|
octave/glottal.m \
|
||||||
|
octave/lsp_pdf.m \
|
||||||
|
octave/phase.m \
|
||||||
|
octave/pl2.m \
|
||||||
|
octave/plinterp.m \
|
||||||
|
octave/plnlp.m \
|
||||||
|
octave/plpitch.m \
|
||||||
|
octave/postfilter.m \
|
||||||
|
octave/load_raw.m \
|
||||||
|
octave/phase2.m \
|
||||||
|
octave/pitch_test.m \
|
||||||
|
octave/plamp.m \
|
||||||
|
octave/pl.m \
|
||||||
|
octave/plphase.m \
|
||||||
|
octave/png.m \
|
||||||
|
octave/pulse.m \
|
||||||
|
raw/b0067.raw \
|
||||||
|
raw/forig_speex_8k.raw \
|
||||||
|
raw/hts1.raw \
|
||||||
|
raw/hts2.raw \
|
||||||
|
raw/mmt1.raw \
|
||||||
|
raw/morig_speex_8k.raw \
|
||||||
|
raw/f2400.raw \
|
||||||
|
raw/hts1a_g729a.raw \
|
||||||
|
raw/hts2a_g729a.raw \
|
||||||
|
raw/hts.raw \
|
||||||
|
raw/mmt1_speex_8k.raw \
|
||||||
|
raw/forig_g729a.raw \
|
||||||
|
raw/hts1a_gsm13k.raw \
|
||||||
|
raw/hts2a_gsm13k.raw \
|
||||||
|
raw/m2400.raw \
|
||||||
|
raw/morig_g729a.raw \
|
||||||
|
raw/forig_gsm13k.raw \
|
||||||
|
raw/hts1a.raw \
|
||||||
|
raw/hts2a.raw \
|
||||||
|
raw/mmt1_g729a.raw \
|
||||||
|
raw/morig_gsm13k.raw \
|
||||||
|
raw/forig.raw \
|
||||||
|
raw/hts1a_speex_8k.raw \
|
||||||
|
raw/hts2a_speex_8k.raw \
|
||||||
|
raw/mmt1_gsm13k.raw \
|
||||||
|
raw/morig.raw \
|
||||||
|
script/menu.sh \
|
||||||
|
script/playraw.sh \
|
||||||
|
script/raw2wav.sh \
|
||||||
|
script/wav2raw.sh \
|
||||||
|
wav/f2400.wav \
|
||||||
|
wav/hts1a_c2_v0.1.wav \
|
||||||
|
wav/hts1a.wav \
|
||||||
|
wav/hts2a_speex_8k.wav \
|
||||||
|
wav/mmt1_speex_8k.wav \
|
||||||
|
wav/morig.wav \
|
||||||
|
wav/forig_speex_8k.wav \
|
||||||
|
wav/hts1a_g729a.wav \
|
||||||
|
wav/hts2a_c2_v0.1.wav \
|
||||||
|
wav/hts2a.wav \
|
||||||
|
wav/mmt1.wav \
|
||||||
|
wav/forig.wav \
|
||||||
|
wav/hts1a_speex_8k.wav \
|
||||||
|
wav/hts2a_g729a.wav \
|
||||||
|
wav/m2400.wav \
|
||||||
|
wav/morig_speex_8k.wav \
|
||||||
|
src/globals.c \
|
||||||
|
doc/A_m.gif \
|
||||||
|
doc/omega_0.gif \
|
||||||
|
doc/phi_m.gif \
|
||||||
|
doc/s_n.gif \
|
||||||
|
doc/s_n.txt \
|
||||||
|
unittest/lsp2.txt \
|
||||||
|
unittest/lsp7.txt \
|
||||||
|
unittest/lspd78.txt \
|
||||||
|
unittest/lsp3.txt \
|
||||||
|
unittest/lsp8.txt \
|
||||||
|
unittest/lspd910.txt \
|
||||||
|
unittest/lsp4.txt \
|
||||||
|
unittest/lsp9.txt \
|
||||||
|
unittest/lsp10.txt \
|
||||||
|
unittest/lsp5.txt \
|
||||||
|
unittest/lspd123.txt \
|
||||||
|
unittest/lsp1.txt \
|
||||||
|
unittest/lsp6.txt \
|
||||||
|
unittest/lspd456.txt \
|
||||||
|
src/codeall.sh \
|
||||||
|
src/fq20.sh \
|
||||||
|
src/listen1.sh \
|
||||||
|
src/listen.sh \
|
||||||
|
src/listensim.sh \
|
||||||
|
src/sim.sh
|
||||||
|
|
||||||
|
SUBDIRS = src unittest
|
||||||
|
all: all-recursive
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
am--refresh:
|
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
|
||||||
|
cd $(srcdir) && $(AUTOMAKE) --gnu \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
echo ' $(SHELL) ./config.status'; \
|
||||||
|
$(SHELL) ./config.status;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool:
|
||||||
|
-rm -f libtool
|
||||||
|
uninstall-info-am:
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run `make' without going through this Makefile.
|
||||||
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
|
$(RECURSIVE_TARGETS):
|
||||||
|
@failcom='exit 1'; \
|
||||||
|
for f in x $$MAKEFLAGS; do \
|
||||||
|
case $$f in \
|
||||||
|
*=* | --[!k]*);; \
|
||||||
|
*k*) failcom='fail=yes';; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
dot_seen=yes; \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| eval $$failcom; \
|
||||||
|
done; \
|
||||||
|
if test "$$dot_seen" = "no"; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||||
|
fi; test -z "$$fail"
|
||||||
|
|
||||||
|
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||||
|
maintainer-clean-recursive:
|
||||||
|
@failcom='exit 1'; \
|
||||||
|
for f in x $$MAKEFLAGS; do \
|
||||||
|
case $$f in \
|
||||||
|
*=* | --[!k]*);; \
|
||||||
|
*k*) failcom='fail=yes';; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
dot_seen=no; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
rev=''; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = "."; then :; else \
|
||||||
|
rev="$$subdir $$rev"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
rev="$$rev ."; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| eval $$failcom; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||||
|
done
|
||||||
|
ctags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||||
|
include_option=--etags-include; \
|
||||||
|
empty_fix=.; \
|
||||||
|
else \
|
||||||
|
include_option=--include; \
|
||||||
|
empty_fix=; \
|
||||||
|
fi; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test ! -f $$subdir/TAGS || \
|
||||||
|
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$tags $$unique; \
|
||||||
|
fi
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& cd $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) $$here
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
mkdir $(distdir)
|
||||||
|
$(mkdir_p) $(distdir)/doc $(distdir)/octave $(distdir)/pitch $(distdir)/raw $(distdir)/script $(distdir)/src $(distdir)/unittest $(distdir)/wav
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
list='$(DISTFILES)'; for file in $$list; do \
|
||||||
|
case $$file in \
|
||||||
|
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
||||||
|
esac; \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
||||||
|
dir="/$$dir"; \
|
||||||
|
$(mkdir_p) "$(distdir)$$dir"; \
|
||||||
|
else \
|
||||||
|
dir=''; \
|
||||||
|
fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test -d "$(distdir)/$$subdir" \
|
||||||
|
|| $(mkdir_p) "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
distdir=`$(am__cd) $(distdir) && pwd`; \
|
||||||
|
top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
|
||||||
|
(cd $$subdir && \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="$$top_distdir" \
|
||||||
|
distdir="$$distdir/$$subdir" \
|
||||||
|
distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
|
||||||
|
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|
||||||
|
|| chmod -R a+r $(distdir)
|
||||||
|
dist-gzip: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir
|
||||||
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir
|
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
|
$(am__remove_distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist
|
||||||
|
case '$(DIST_ARCHIVES)' in \
|
||||||
|
*.tar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build
|
||||||
|
mkdir $(distdir)/_inst
|
||||||
|
chmod a-w $(distdir)
|
||||||
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
|
&& cd $(distdir)/_build \
|
||||||
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||||
|
distuninstallcheck \
|
||||||
|
&& chmod -R a-w "$$dc_install_base" \
|
||||||
|
&& ({ \
|
||||||
|
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||||
|
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||||
|
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||||
|
&& rm -rf "$$dc_destdir" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||||
|
&& rm -rf $(DIST_ARCHIVES) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
|
||||||
|
$(am__remove_distdir)
|
||||||
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
|
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
|
||||||
|
distuninstallcheck:
|
||||||
|
@cd $(distuninstallcheck_dir) \
|
||||||
|
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
||||||
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
|
if test -n "$(DESTDIR)"; then \
|
||||||
|
echo " (check DESTDIR support)"; \
|
||||||
|
fi ; \
|
||||||
|
$(distuninstallcheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
distcleancheck: distclean
|
||||||
|
@if test '$(srcdir)' = . ; then \
|
||||||
|
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||||
|
$(distcleancheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
check-am: all-am
|
||||||
|
check: check-recursive
|
||||||
|
all-am: Makefile
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
installdirs-am:
|
||||||
|
install: install-recursive
|
||||||
|
install-exec: install-exec-recursive
|
||||||
|
install-data: install-data-recursive
|
||||||
|
uninstall: uninstall-recursive
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-recursive
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-recursive
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-libtool \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-recursive
|
||||||
|
|
||||||
|
info: info-recursive
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am:
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
install-info: install-info-recursive
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-recursive
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-recursive
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-info-am
|
||||||
|
|
||||||
|
uninstall-info: uninstall-info-recursive
|
||||||
|
|
||||||
|
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
|
||||||
|
check-am clean clean-generic clean-libtool clean-recursive \
|
||||||
|
ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
|
||||||
|
dist-shar dist-tarZ dist-zip distcheck distclean \
|
||||||
|
distclean-generic distclean-libtool distclean-recursive \
|
||||||
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
|
dvi-am html html-am info info-am install install-am \
|
||||||
|
install-data install-data-am install-exec install-exec-am \
|
||||||
|
install-info install-info-am install-man install-strip \
|
||||||
|
installcheck installcheck-am installdirs installdirs-am \
|
||||||
|
maintainer-clean maintainer-clean-generic \
|
||||||
|
maintainer-clean-recursive mostlyclean mostlyclean-generic \
|
||||||
|
mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
|
||||||
|
tags tags-recursive uninstall uninstall-am uninstall-info-am
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
0
libs/libcodec2/NEWS
Normal file
0
libs/libcodec2/NEWS
Normal file
0
libs/libcodec2/README
Normal file
0
libs/libcodec2/README
Normal file
4
libs/libcodec2/configure.gnu
Normal file
4
libs/libcodec2/configure.gnu
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
|
||||||
|
$srcpath/configure "$@" --disable-shared --with-pic
|
||||||
|
|
26
libs/libcodec2/configure.in
Normal file
26
libs/libcodec2/configure.in
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# -*- Autoconf -*-
|
||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ([2.59])
|
||||||
|
AC_INIT(libcodec2, 1.0, david@rowetel.com)
|
||||||
|
AM_INIT_AUTOMAKE(libcodec2,1.0)
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# Checks for libraries.
|
||||||
|
# FIXME: Replace `main' with a function in `-lm':
|
||||||
|
AC_CHECK_LIB([m], [main])
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_CHECK_HEADERS([stdlib.h string.h])
|
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_FUNC_MALLOC
|
||||||
|
AC_CHECK_FUNCS([floor pow sqrt])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile src/Makefile unittest/Makefile])
|
||||||
|
AC_OUTPUT
|
BIN
libs/libcodec2/doc/A_m.gif
Normal file
BIN
libs/libcodec2/doc/A_m.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 133 B |
BIN
libs/libcodec2/doc/omega_0.gif
Normal file
BIN
libs/libcodec2/doc/omega_0.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 552 B |
BIN
libs/libcodec2/doc/phi_m.gif
Normal file
BIN
libs/libcodec2/doc/phi_m.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 135 B |
BIN
libs/libcodec2/doc/s_n.gif
Normal file
BIN
libs/libcodec2/doc/s_n.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
1
libs/libcodec2/doc/s_n.txt
Normal file
1
libs/libcodec2/doc/s_n.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
s(n)=A_1cos(\omega_0+\phi_1)+A_2cos(2\omega_0+\phi_2)+...+A_Lcos(L\omega_0+\phi_L)
|
25
libs/libcodec2/octave/glottal.m
Normal file
25
libs/libcodec2/octave/glottal.m
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
% glottal.m
|
||||||
|
% David Rowe 12 Sep 2009
|
||||||
|
% Matlab script to generate the phase spectra of a glottal pulse
|
||||||
|
|
||||||
|
% lpc10 pulse from spandsp. When the file glottal.c was used as a part of the
|
||||||
|
% excitation phase component in phase.c, phase_synth_zero_order(), no difference
|
||||||
|
% in speech quality was apparent. So left out of code for now.
|
||||||
|
|
||||||
|
sh=12
|
||||||
|
kexc = [ 8, -16, 26, -48, 86, -162, 294, -502, 718, -728, 184 672, -610, -672, 184, 728, 718, 502, 294, 162, 86, 48, 26, 16, 8];
|
||||||
|
kexc = shift(kexc,sh);
|
||||||
|
kexc = [kexc(1:sh) zeros(1,512-25) kexc(sh+1:25)];
|
||||||
|
figure(1)
|
||||||
|
plot(kexc)
|
||||||
|
figure(2)
|
||||||
|
G = fft(kexc);
|
||||||
|
plot((1:256)*(4000/256),unwrap(angle(G(1:256))))
|
||||||
|
|
||||||
|
f=fopen("glottal.c","wt");
|
||||||
|
fprintf(f,"float glottal[]={\n");
|
||||||
|
for m=1:255
|
||||||
|
fprintf(f," %f,\n",angle(G(m)));
|
||||||
|
endfor
|
||||||
|
fprintf(f," %f};\n",angle(G(256)));
|
||||||
|
fclose(f);
|
8
libs/libcodec2/octave/load_raw.m
Normal file
8
libs/libcodec2/octave/load_raw.m
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
% load_raw.m
|
||||||
|
% David Rowe 7 Oct 2009
|
||||||
|
|
||||||
|
function s = load_raw(fn)
|
||||||
|
fs=fopen(fn,"rb");
|
||||||
|
s = fread(fs,Inf,"short");
|
||||||
|
plot(s)
|
||||||
|
endfunction
|
50
libs/libcodec2/octave/lsp_pdf.m
Normal file
50
libs/libcodec2/octave/lsp_pdf.m
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
% lsp_pdf.m
|
||||||
|
% David Rowe 2 Oct 2009
|
||||||
|
% Plots histograms (PDF estimates) of LSP training data
|
||||||
|
|
||||||
|
function lsp_pdf(lsp)
|
||||||
|
[r,c] = size(lsp);
|
||||||
|
|
||||||
|
% LSPs
|
||||||
|
|
||||||
|
figure(3);
|
||||||
|
clf;
|
||||||
|
[x,y] = hist(lsp(:,1),100);
|
||||||
|
plot(y*4000/pi,x,";1;");
|
||||||
|
hold on;
|
||||||
|
for i=2:c
|
||||||
|
[x,y] = hist(lsp(:,i),100);
|
||||||
|
legend = sprintf(";%d;",i);
|
||||||
|
plot(y*4000/pi,x,legend);
|
||||||
|
endfor
|
||||||
|
hold off;
|
||||||
|
grid;
|
||||||
|
|
||||||
|
% LSP differences
|
||||||
|
|
||||||
|
figure(4);
|
||||||
|
clf;
|
||||||
|
subplot(211)
|
||||||
|
[x,y] = hist(lsp(:,1),100);
|
||||||
|
plot(y,x,";1;");
|
||||||
|
hold on;
|
||||||
|
for i=2:5
|
||||||
|
[x,y] = hist(lsp(:,i) - lsp(:,i-1),100);
|
||||||
|
legend = sprintf(";%d;",i);
|
||||||
|
plot(y,x,legend);
|
||||||
|
endfor
|
||||||
|
hold off;
|
||||||
|
grid;
|
||||||
|
|
||||||
|
subplot(212)
|
||||||
|
[x,y] = hist(lsp(:,6)-lsp(:,5),100);
|
||||||
|
plot(y,x,";6;");
|
||||||
|
hold on;
|
||||||
|
for i=7:c
|
||||||
|
[x,y] = hist(lsp(:,i) - lsp(:,i-1),100);
|
||||||
|
legend = sprintf(";%d;",i);
|
||||||
|
plot(y,x,legend);
|
||||||
|
endfor
|
||||||
|
hold off;
|
||||||
|
grid;
|
||||||
|
endfunction
|
56
libs/libcodec2/octave/phase.m
Normal file
56
libs/libcodec2/octave/phase.m
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
% phase.m
|
||||||
|
% David Rowe August 2009
|
||||||
|
% experiments with phase for sinusoidal codecs
|
||||||
|
|
||||||
|
function phase(samname, F0, png)
|
||||||
|
Wo=2*pi*F0/8000;
|
||||||
|
P=2*pi/Wo;
|
||||||
|
L = floor(pi/Wo);
|
||||||
|
Nsam = 16000;
|
||||||
|
N = 80;
|
||||||
|
F = Nsam/N;
|
||||||
|
A = 10000/L;
|
||||||
|
phi = zeros(1,L);
|
||||||
|
s = zeros(1,Nsam);
|
||||||
|
|
||||||
|
for m=floor(L/2):L
|
||||||
|
phi_off(m) = -m*Wo*8;
|
||||||
|
end
|
||||||
|
|
||||||
|
for f=1:F
|
||||||
|
phi(1) = phi(1) + Wo*N;
|
||||||
|
phi(1) = mod(phi(1),2*pi);
|
||||||
|
|
||||||
|
for m=1:L
|
||||||
|
phi(m) = m*phi(1);
|
||||||
|
end
|
||||||
|
|
||||||
|
x = zeros(1,N);
|
||||||
|
for m=1:L
|
||||||
|
x = x + A*cos(m*Wo*(0:(N-1)) + phi(m));
|
||||||
|
endfor
|
||||||
|
s((f-1)*N+1:f*N) = x;
|
||||||
|
endfor
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
plot(s(1:250));
|
||||||
|
|
||||||
|
fs=fopen(samname,"wb");
|
||||||
|
fwrite(fs,s,"short");
|
||||||
|
fclose(fs);
|
||||||
|
|
||||||
|
if (nargin == 3)
|
||||||
|
% small image to fit blog
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 450,300
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s.png\"", samname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% for some reason I need this to stop large plot getting wiped
|
||||||
|
__gnuplot_set__ output "/dev/null"
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
50
libs/libcodec2/octave/phase2.m
Normal file
50
libs/libcodec2/octave/phase2.m
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
% phase2.m
|
||||||
|
% David Rowe Sep 2009
|
||||||
|
% experiments with phase for sinusoidal codecs, looking at phase
|
||||||
|
% of excitation with real Am samples from hts1
|
||||||
|
|
||||||
|
function phase2(samname, png)
|
||||||
|
N = 16000;
|
||||||
|
|
||||||
|
f=45;
|
||||||
|
model = load("../src/hts1a_model.txt");
|
||||||
|
phase = load("../src/hts1a_phase_phase.txt");
|
||||||
|
Wo = model(f,1);
|
||||||
|
P=2*pi/Wo;
|
||||||
|
L = model(f,2);
|
||||||
|
A = model(f,3:(L+2));
|
||||||
|
phi = phase(f,1:L);
|
||||||
|
phi = zeros(1,L);
|
||||||
|
for m=L/2:L
|
||||||
|
phi(m) = 2*pi*rand(1,1);
|
||||||
|
end
|
||||||
|
|
||||||
|
s = zeros(1,N);
|
||||||
|
|
||||||
|
for m=1:L
|
||||||
|
s_m = A(m)*cos(m*Wo*(0:(N-1)) + phi(m));
|
||||||
|
s = s + s_m;
|
||||||
|
endfor
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
plot(s(1:250));
|
||||||
|
|
||||||
|
fs=fopen(samname,"wb");
|
||||||
|
fwrite(fs,s,"short");
|
||||||
|
fclose(fs);
|
||||||
|
|
||||||
|
if (nargin == 2)
|
||||||
|
% small image to fit blog
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 450,300
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s.png\"", samname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% for some reason I need this to stop large plot getting wiped
|
||||||
|
__gnuplot_set__ output "/dev/null"
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
39
libs/libcodec2/octave/pitch_test.m
Normal file
39
libs/libcodec2/octave/pitch_test.m
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
% pitch_test.m
|
||||||
|
% David Rowe Sep 2009
|
||||||
|
% Constructs a sequence to test the pitch estimator
|
||||||
|
|
||||||
|
function pitch_test(samname)
|
||||||
|
M=320;
|
||||||
|
F=200;
|
||||||
|
|
||||||
|
fs=fopen(samname,"wb");
|
||||||
|
|
||||||
|
f0 = 100;
|
||||||
|
for f=1:200
|
||||||
|
Wo=2*pi*f0/8000;
|
||||||
|
P=2*pi/Wo;
|
||||||
|
L = floor(pi/Wo);
|
||||||
|
A = 10000/L;
|
||||||
|
phi = zeros(1,L);
|
||||||
|
s = zeros(1,M);
|
||||||
|
|
||||||
|
for m=1:L
|
||||||
|
s = s + A*cos(m*Wo*(0:(M-1)) + phi(m));
|
||||||
|
endfor
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
plot(s);
|
||||||
|
|
||||||
|
fwrite(fs,s,"short");
|
||||||
|
|
||||||
|
f0 = f0 + 5;
|
||||||
|
if (f0 > 400)
|
||||||
|
f0 = 100;
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
fclose(fs);
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
42
libs/libcodec2/octave/pl.m
Normal file
42
libs/libcodec2/octave/pl.m
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
|
||||||
|
function pl(samname1, start_sam, end_sam, pngname)
|
||||||
|
|
||||||
|
fs=fopen(samname1,"rb");
|
||||||
|
s=fread(fs,Inf,"short");
|
||||||
|
|
||||||
|
st = 1;
|
||||||
|
en = length(s);
|
||||||
|
if (nargin >= 2)
|
||||||
|
st = start_sam;
|
||||||
|
endif
|
||||||
|
if (nargin >= 3)
|
||||||
|
en = end_sam;
|
||||||
|
endif
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
plot(s(st:en));
|
||||||
|
axis([1 en-st min(s) max(s)]);
|
||||||
|
|
||||||
|
if (nargin == 4)
|
||||||
|
|
||||||
|
% small image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 420,300
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% larger image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 800,600
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
50
libs/libcodec2/octave/pl2.m
Normal file
50
libs/libcodec2/octave/pl2.m
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
|
||||||
|
function pl2(samname1, samname2, start_sam, end_sam, pngname)
|
||||||
|
|
||||||
|
fs1=fopen(samname1,"rb");
|
||||||
|
s1=fread(fs1,Inf,"short");
|
||||||
|
fs2=fopen(samname2,"rb");
|
||||||
|
s2=fread(fs2,Inf,"short");
|
||||||
|
|
||||||
|
st = 1;
|
||||||
|
en = length(s1);
|
||||||
|
if (nargin >= 3)
|
||||||
|
st = start_sam;
|
||||||
|
endif
|
||||||
|
if (nargin >= 4)
|
||||||
|
en = end_sam;
|
||||||
|
endif
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
subplot(211);
|
||||||
|
l1 = strcat("r;",samname1,";");
|
||||||
|
plot(s1(st:en), l1);
|
||||||
|
axis([1 en-st min(s1(st:en)) max(s1(st:en))]);
|
||||||
|
subplot(212);
|
||||||
|
l2 = strcat("r;",samname2,";");
|
||||||
|
plot(s2(st:en),l2);
|
||||||
|
axis([1 en-st min(s1(st:en)) max(s1(st:en))]);
|
||||||
|
|
||||||
|
if (nargin == 5)
|
||||||
|
|
||||||
|
% small image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 420,300
|
||||||
|
s = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
|
||||||
|
eval(s)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% larger image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 800,600
|
||||||
|
s = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
|
||||||
|
eval(s)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
166
libs/libcodec2/octave/plamp.m
Normal file
166
libs/libcodec2/octave/plamp.m
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% Plot ampltiude modelling information from dump files.
|
||||||
|
|
||||||
|
function plamp(samname, f)
|
||||||
|
|
||||||
|
sn_name = strcat(samname,"_sn.txt");
|
||||||
|
Sn = load(sn_name);
|
||||||
|
|
||||||
|
sw_name = strcat(samname,"_sw.txt");
|
||||||
|
Sw = load(sw_name);
|
||||||
|
|
||||||
|
sw__name = strcat(samname,"_sw_.txt");
|
||||||
|
if (file_in_path(".",sw__name))
|
||||||
|
Sw_ = load(sw__name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
model_name = strcat(samname,"_model.txt");
|
||||||
|
model = load(model_name);
|
||||||
|
|
||||||
|
modelq_name = strcat(samname,"_qmodel.txt");
|
||||||
|
if (file_in_path(".",modelq_name))
|
||||||
|
modelq = load(modelq_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
pw_name = strcat(samname,"_pw.txt");
|
||||||
|
if (file_in_path(".",pw_name))
|
||||||
|
Pw = load(pw_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
lsp_name = strcat(samname,"_lsp.txt");
|
||||||
|
if (file_in_path(".",lsp_name))
|
||||||
|
lsp = load(lsp_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
phase_name = strcat(samname,"_phase.txt");
|
||||||
|
if (file_in_path(".",phase_name))
|
||||||
|
phase = load(phase_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
phase_name_ = strcat(samname,"_phase_.txt");
|
||||||
|
if (file_in_path(".",phase_name_))
|
||||||
|
phase_ = load(phase_name_);
|
||||||
|
endif
|
||||||
|
|
||||||
|
snr_name = strcat(samname,"_snr.txt");
|
||||||
|
if (file_in_path(".",snr_name))
|
||||||
|
snr = load(snr_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
k = ' ';
|
||||||
|
do
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
% s = [ Sn(2*(f-2)-1,:) Sn(2*(f-2),:) ];
|
||||||
|
s = [ Sn(2*f-1,:) Sn(2*f,:) ];
|
||||||
|
plot(s);
|
||||||
|
axis([1 length(s) -20000 20000]);
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
Wo = model(f,1);
|
||||||
|
L = model(f,2);
|
||||||
|
Am = model(f,3:(L+2));
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(Am),";Am;r");
|
||||||
|
axis([1 4000 -10 80]);
|
||||||
|
hold on;
|
||||||
|
% plot((0:255)*4000/256, Sw(f-2,:),";Sw;");
|
||||||
|
plot((0:255)*4000/256, Sw(f,:),";Sw;");
|
||||||
|
|
||||||
|
if (file_in_path(".",modelq_name))
|
||||||
|
Amq = modelq(f,3:(L+2));
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;g" );
|
||||||
|
if (file_in_path(".",pw_name))
|
||||||
|
plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;c");
|
||||||
|
endif
|
||||||
|
signal = Am * Am';
|
||||||
|
noise = (Am-Amq) * (Am-Amq)';
|
||||||
|
snr1 = 10*log10(signal/noise);
|
||||||
|
Am_err_label = sprintf(";Am error SNR %4.2f dB;m",snr1);
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label);
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",snr_name))
|
||||||
|
snr_label = sprintf(";phase SNR %4.2f dB;",snr(f));
|
||||||
|
plot(1,1,snr_label);
|
||||||
|
endif
|
||||||
|
|
||||||
|
% phase model - determine SNR and error spectrum for phase model 1
|
||||||
|
|
||||||
|
if (file_in_path(".",phase_name_))
|
||||||
|
orig = Am.*exp(j*phase(f,1:L));
|
||||||
|
synth = Am.*exp(j*phase_(f,1:L));
|
||||||
|
signal = orig * orig';
|
||||||
|
noise = (orig-synth) * (orig-synth)';
|
||||||
|
snr_phase = 10*log10(signal/noise);
|
||||||
|
|
||||||
|
phase_err_label = sprintf(";phase_err SNR %4.2f dB;",snr_phase);
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(orig-synth), phase_err_label);
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",lsp_name))
|
||||||
|
for l=1:10
|
||||||
|
plot([lsp(f,l)*4000/pi lsp(f,l)*4000/pi], [60 80], 'r');
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
if (file_in_path(".",phase_name))
|
||||||
|
figure(3);
|
||||||
|
plot((1:L)*Wo*4000/pi, phase(f,1:L), ";phase;");
|
||||||
|
axis;
|
||||||
|
if (file_in_path(".",phase_name_))
|
||||||
|
hold on;
|
||||||
|
plot((1:L)*Wo*4000/pi, phase_(f,1:L), ";phase_;");
|
||||||
|
hold off;
|
||||||
|
endif
|
||||||
|
figure(2);
|
||||||
|
endif
|
||||||
|
|
||||||
|
% autocorrelation function to research voicing est
|
||||||
|
|
||||||
|
%M = length(s);
|
||||||
|
%sw = s .* hanning(M)';
|
||||||
|
%for k=0:159
|
||||||
|
% R(k+1) = sw(1:320-k) * sw(1+k:320)';
|
||||||
|
%endfor
|
||||||
|
%figure(4);
|
||||||
|
%R_label = sprintf(";R(k) %3.2f;",max(R(20:159))/R(1));
|
||||||
|
%plot(R/R(1),R_label);
|
||||||
|
%grid
|
||||||
|
|
||||||
|
% interactive menu
|
||||||
|
|
||||||
|
printf("\rframe: %d menu: n-next b-back p-png q-quit ", f);
|
||||||
|
fflush(stdout);
|
||||||
|
k = kbhit();
|
||||||
|
if (k == 'n')
|
||||||
|
f = f + 1;
|
||||||
|
endif
|
||||||
|
if (k == 'b')
|
||||||
|
f = f - 1;
|
||||||
|
endif
|
||||||
|
|
||||||
|
% optional print to PNG
|
||||||
|
|
||||||
|
if (k == 'p')
|
||||||
|
figure(1);
|
||||||
|
pngname = sprintf("%s_%d_sn.png",samname,f);
|
||||||
|
print(pngname, '-dpng', "-S500,500")
|
||||||
|
pngname = sprintf("%s_%d_sn_large.png",samname,f);
|
||||||
|
print(pngname, '-dpng', "-S800,600")
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
pngname = sprintf("%s_%d_sw.png",samname,f);
|
||||||
|
print(pngname, '-dpng', "-S500,500")
|
||||||
|
pngname = sprintf("%s_%d_sw_large.png",samname,f);
|
||||||
|
print(pngname, '-dpng', "-S800,600")
|
||||||
|
endif
|
||||||
|
|
||||||
|
until (k == 'q')
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
endfunction
|
11
libs/libcodec2/octave/plinterp.m
Normal file
11
libs/libcodec2/octave/plinterp.m
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
load ../unittest/tinterp_prev.txt;
|
||||||
|
load ../unittest/tinterp_interp.txt;
|
||||||
|
load ../unittest/tinterp_next.txt;
|
||||||
|
|
||||||
|
clf;
|
||||||
|
plot(tinterp_prev(:,1), 20.0*log10(tinterp_prev(:,2)),";prev;")
|
||||||
|
hold on;
|
||||||
|
plot(tinterp_interp(:,1), 20.0*log10(tinterp_interp(:,2)),'g+-;interp;')
|
||||||
|
plot(tinterp_next(:,1), 20.0*log10(tinterp_next(:,2)),'ro-;next;')
|
||||||
|
hold off;
|
||||||
|
axis([0 pi 0 80])
|
134
libs/libcodec2/octave/plnlp.m
Normal file
134
libs/libcodec2/octave/plnlp.m
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% Plot NLP states from dump files.
|
||||||
|
|
||||||
|
function plnlp(samname, f)
|
||||||
|
|
||||||
|
sn_name = strcat(samname,"_sn.txt");
|
||||||
|
Sn = load(sn_name);
|
||||||
|
|
||||||
|
sw_name = strcat(samname,"_sw.txt");
|
||||||
|
Sw = load(sw_name);
|
||||||
|
|
||||||
|
fw_name = strcat(samname,"_fw.txt");
|
||||||
|
if (file_in_path(".",fw_name))
|
||||||
|
fw = load(fw_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
e_name = strcat(samname,"_e.txt");
|
||||||
|
if (file_in_path(".",e_name))
|
||||||
|
e = load(e_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
p_name = strcat(samname,".p");
|
||||||
|
if (file_in_path(".",p_name))
|
||||||
|
p = load(p_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
sq_name = strcat(samname,"_sq.txt");
|
||||||
|
if (file_in_path(".",sq_name))
|
||||||
|
sq = load(sq_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
dec_name = strcat(samname,"_dec.txt");
|
||||||
|
if (file_in_path(".",dec_name))
|
||||||
|
dec = load(dec_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
do
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
s = [ Sn(2*f-1,:) Sn(2*f,:) ];
|
||||||
|
plot(s, ";Sn;");
|
||||||
|
grid
|
||||||
|
axis([1 length(s) -20000 20000]);
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
plot((0:255)*4000/256, Sw(f,:),";Sw;");
|
||||||
|
grid
|
||||||
|
axis([1 4000 -10 80]);
|
||||||
|
hold on;
|
||||||
|
|
||||||
|
f0 = 8000/p(f);
|
||||||
|
Wo = 2*pi/p(f);
|
||||||
|
L = floor(pi/Wo);
|
||||||
|
f0_label = sprintf("b;P=%3.1f F0=%3.0f;",p(f),f0);
|
||||||
|
for m=1:L-1
|
||||||
|
plot([ m*Wo*4000/pi m*Wo*4000/pi], [10 60], 'b');
|
||||||
|
endfor
|
||||||
|
plot([ L*Wo*4000/pi L*Wo*4000/pi], [10 60], f0_label);
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
if (file_in_path(".",fw_name))
|
||||||
|
figure(3);
|
||||||
|
if (file_in_path(".",e_name))
|
||||||
|
subplot(211);
|
||||||
|
endif
|
||||||
|
plot((0:255)*800/256, fw(f,:)/max(fw(f,:)), ";Fw;");
|
||||||
|
axis([1 400 0 1]);
|
||||||
|
if (file_in_path(".",e_name))
|
||||||
|
subplot(212);
|
||||||
|
e_concat = [ e(2*f-1,:) e(2*f,:) ];
|
||||||
|
plot(e_concat(1:400)/max(e_concat(1:400)), "+;MBE E(f);");
|
||||||
|
axis([1 400 0 1]);
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",sq_name))
|
||||||
|
figure(4);
|
||||||
|
sq_concat = [ sq(2*f-1,:) sq(2*f,:) ];
|
||||||
|
axis
|
||||||
|
plot(sq_concat, ";sq;");
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",dec_name))
|
||||||
|
figure(5);
|
||||||
|
plot(dec(f,:), ";dec;");
|
||||||
|
endif
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
|
||||||
|
% interactive menu
|
||||||
|
|
||||||
|
printf("\rframe: %d menu: n-next b-back p-png q-quit ", f);
|
||||||
|
fflush(stdout);
|
||||||
|
k = kbhit();
|
||||||
|
if (k == 'n')
|
||||||
|
f = f + 1;
|
||||||
|
endif
|
||||||
|
if (k == 'b')
|
||||||
|
f = f - 1;
|
||||||
|
endif
|
||||||
|
|
||||||
|
% optional print to PNG
|
||||||
|
|
||||||
|
if (k == 'p')
|
||||||
|
|
||||||
|
pngname = sprintf("%s_%d",samname,f);
|
||||||
|
|
||||||
|
% small image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 420,300
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% larger image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 800,600
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% for some reason I need this to stop large plot getting wiped
|
||||||
|
__gnuplot_set__ output "/dev/null"
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
until (k == 'q')
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
endfunction
|
198
libs/libcodec2/octave/plphase.m
Normal file
198
libs/libcodec2/octave/plphase.m
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% Plot phase modelling information from dump files.
|
||||||
|
|
||||||
|
function plphase(samname, f)
|
||||||
|
|
||||||
|
sn_name = strcat(samname,"_sn.txt");
|
||||||
|
Sn = load(sn_name);
|
||||||
|
|
||||||
|
sw_name = strcat(samname,"_sw.txt");
|
||||||
|
Sw = load(sw_name);
|
||||||
|
|
||||||
|
model_name = strcat(samname,"_model.txt");
|
||||||
|
model = load(model_name);
|
||||||
|
|
||||||
|
sw__name = strcat(samname,"_sw_.txt");
|
||||||
|
if (file_in_path(".",sw__name))
|
||||||
|
Sw_ = load(sw__name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
pw_name = strcat(samname,"_pw.txt");
|
||||||
|
if (file_in_path(".",pw_name))
|
||||||
|
Pw = load(pw_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
ak_name = strcat(samname,"_ak.txt");
|
||||||
|
if (file_in_path(".",ak_name))
|
||||||
|
ak = load(ak_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
phase_name = strcat(samname,"_phase.txt");
|
||||||
|
if (file_in_path(".",phase_name))
|
||||||
|
phase = load(phase_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
phase_name_ = strcat(samname,"_phase_.txt");
|
||||||
|
if (file_in_path(".",phase_name_))
|
||||||
|
phase_ = load(phase_name_);
|
||||||
|
endif
|
||||||
|
|
||||||
|
snr_name = strcat(samname,"_snr.txt");
|
||||||
|
if (file_in_path(".",snr_name))
|
||||||
|
snr = load(snr_name);
|
||||||
|
endif
|
||||||
|
|
||||||
|
sn_name_ = strcat(samname,".raw");
|
||||||
|
if (file_in_path(".",sn_name_))
|
||||||
|
fs_ = fopen(sn_name_,"rb");
|
||||||
|
sn_ = fread(fs_,Inf,"short");
|
||||||
|
endif
|
||||||
|
|
||||||
|
k = ' ';
|
||||||
|
do
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
s = [ Sn(2*f-1,:) Sn(2*f,:) ];
|
||||||
|
plot(s);
|
||||||
|
grid;
|
||||||
|
axis([1 length(s) -20000 20000]);
|
||||||
|
if (k == 'p')
|
||||||
|
pngname = sprintf("%s_%d_sn",samname,f);
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
Wo = model(f,1);
|
||||||
|
L = model(f,2);
|
||||||
|
Am = model(f,3:(L+2));
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(Am),"r;Am;");
|
||||||
|
axis([1 4000 -10 80]);
|
||||||
|
hold on;
|
||||||
|
plot((0:255)*4000/256, Sw(f,:),";Sw;");
|
||||||
|
grid;
|
||||||
|
|
||||||
|
if (file_in_path(".",sw__name))
|
||||||
|
plot((0:255)*4000/256, Sw_(f,:),"g;Sw_;");
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",pw_name))
|
||||||
|
plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;");
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",snr_name))
|
||||||
|
snr_label = sprintf(";phase SNR %4.2f dB;",snr(f));
|
||||||
|
plot(1,1,snr_label);
|
||||||
|
endif
|
||||||
|
|
||||||
|
% phase model - determine SNR and error spectrum for phase model 1
|
||||||
|
|
||||||
|
if (file_in_path(".",phase_name_))
|
||||||
|
orig = Am.*exp(j*phase(f,1:L));
|
||||||
|
synth = Am.*exp(j*phase_(f,1:L));
|
||||||
|
signal = orig * orig';
|
||||||
|
noise = (orig-synth) * (orig-synth)';
|
||||||
|
snr_phase = 10*log10(signal/noise);
|
||||||
|
|
||||||
|
phase_err_label = sprintf("g;phase_err SNR %4.2f dB;",snr_phase);
|
||||||
|
plot((1:L)*Wo*4000/pi, 20*log10(orig-synth), phase_err_label);
|
||||||
|
endif
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
if (k == 'p')
|
||||||
|
pngname = sprintf("%s_%d_sw",samname,f);
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",phase_name))
|
||||||
|
figure(3);
|
||||||
|
plot((1:L)*Wo*4000/pi, phase(f,1:L)*180/pi, "-o;phase;");
|
||||||
|
axis;
|
||||||
|
if (file_in_path(".", phase_name_))
|
||||||
|
hold on;
|
||||||
|
plot((1:L)*Wo*4000/pi, phase_(f,1:L)*180/pi, "g;phase_;");
|
||||||
|
grid
|
||||||
|
hold off;
|
||||||
|
endif
|
||||||
|
if (k == 'p')
|
||||||
|
pngname = sprintf("%s_%d_phase",samname,f);
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
% synthesised speech
|
||||||
|
|
||||||
|
if (file_in_path(".",sn_name_))
|
||||||
|
figure(4);
|
||||||
|
s_ = sn_((f-3)*80+1:(f+1)*80);
|
||||||
|
plot(s_);
|
||||||
|
axis([1 length(s_) -20000 20000]);
|
||||||
|
if (k == 'p')
|
||||||
|
pngname = sprintf("%s_%d_sn_",samname,f)
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if (file_in_path(".",ak_name))
|
||||||
|
figure(5);
|
||||||
|
axis;
|
||||||
|
akw = ak(f,:);
|
||||||
|
weight = 1.0 .^ (0:length(akw)-1);
|
||||||
|
akw = akw .* weight;
|
||||||
|
H = 1./fft(akw,8000);
|
||||||
|
subplot(211);
|
||||||
|
plot(20*log10(abs(H(1:4000))),";LPC mag spec;");
|
||||||
|
grid;
|
||||||
|
subplot(212);
|
||||||
|
plot(angle(H(1:4000))*180/pi,";LPC phase spec;");
|
||||||
|
grid;
|
||||||
|
if (k == 'p')
|
||||||
|
% stops multimode errors from gnuplot, I know not why...
|
||||||
|
figure(2);
|
||||||
|
figure(5);
|
||||||
|
|
||||||
|
pngname = sprintf("%s_%d_lpc",samname,f);
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
% autocorrelation function to research voicing est
|
||||||
|
|
||||||
|
%M = length(s);
|
||||||
|
%sw = s .* hanning(M)';
|
||||||
|
%for k=0:159
|
||||||
|
% R(k+1) = sw(1:320-k) * sw(1+k:320)';
|
||||||
|
%endfor
|
||||||
|
%figure(4);
|
||||||
|
%R_label = sprintf(";R(k) %3.2f;",max(R(20:159))/R(1));
|
||||||
|
%plot(R/R(1),R_label);
|
||||||
|
%grid
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
|
||||||
|
% interactive menu
|
||||||
|
|
||||||
|
printf("\rframe: %d menu: n-next b-back p-png q-quit ", f);
|
||||||
|
fflush(stdout);
|
||||||
|
k = kbhit();
|
||||||
|
if (k == 'n')
|
||||||
|
f = f + 1;
|
||||||
|
endif
|
||||||
|
if (k == 'b')
|
||||||
|
f = f - 1;
|
||||||
|
endif
|
||||||
|
|
||||||
|
% optional print to PNG
|
||||||
|
|
||||||
|
if (k == 'p')
|
||||||
|
pngname = sprintf("%s_%d",samname,f);
|
||||||
|
png(pngname);
|
||||||
|
endif
|
||||||
|
|
||||||
|
until (k == 'q')
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
endfunction
|
36
libs/libcodec2/octave/plpitch.m
Normal file
36
libs/libcodec2/octave/plpitch.m
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% plpitch.m
|
||||||
|
% Plots two pitch tracks on top of each other, used for comparing pitch
|
||||||
|
% estimators
|
||||||
|
|
||||||
|
function plpitch(pitch1_name, pitch2_name, start_fr, end_fr)
|
||||||
|
|
||||||
|
pitch1 = load(pitch1_name);
|
||||||
|
pitch2 = load(pitch2_name);
|
||||||
|
|
||||||
|
st = 1;
|
||||||
|
en = length(pitch1);
|
||||||
|
if (nargin >= 3)
|
||||||
|
st = start_fr;
|
||||||
|
endif
|
||||||
|
if (nargin >= 4)
|
||||||
|
en = end_fr;
|
||||||
|
endif
|
||||||
|
|
||||||
|
figure(1);
|
||||||
|
clf;
|
||||||
|
l1 = strcat("r;",pitch1_name,";")
|
||||||
|
l1
|
||||||
|
st
|
||||||
|
en
|
||||||
|
plot(pitch1(st:en), l1);
|
||||||
|
axis([1 en-st 20 160]);
|
||||||
|
l2 = strcat("g;",pitch2_name,";");
|
||||||
|
hold on;
|
||||||
|
plot(pitch2(st:en),l2);
|
||||||
|
hold off;
|
||||||
|
endfunction
|
||||||
|
|
25
libs/libcodec2/octave/png.m
Normal file
25
libs/libcodec2/octave/png.m
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% Replot current plot as a png, generates small and large versions
|
||||||
|
|
||||||
|
function png(pngname)
|
||||||
|
% small image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 420,300
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% larger image
|
||||||
|
|
||||||
|
__gnuplot_set__ terminal png size 800,600
|
||||||
|
ss = sprintf("__gnuplot_set__ output \"%s_large.png\"", pngname);
|
||||||
|
eval(ss)
|
||||||
|
replot;
|
||||||
|
|
||||||
|
% for some reason I need this to stop large plot getting wiped
|
||||||
|
__gnuplot_set__ output "/dev/null"
|
||||||
|
|
||||||
|
endfunction
|
24
libs/libcodec2/octave/postfilter.m
Normal file
24
libs/libcodec2/octave/postfilter.m
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
% Copyright David Rowe 2009
|
||||||
|
% This program is distributed under the terms of the GNU General Public License
|
||||||
|
% Version 2
|
||||||
|
%
|
||||||
|
% Plot postfilter doing its thing
|
||||||
|
|
||||||
|
function postfilter(samname)
|
||||||
|
p = load(samname);
|
||||||
|
figure(1);
|
||||||
|
plot(p(:,1),";energy;");
|
||||||
|
hold on;
|
||||||
|
plot(p(:,2),";bg_est;");
|
||||||
|
hold off;
|
||||||
|
grid;
|
||||||
|
pngname=sprintf("%s_postfilter_1", samname);
|
||||||
|
png(pngname);
|
||||||
|
|
||||||
|
figure(2);
|
||||||
|
plot(p(:,3),";% unvoiced;");
|
||||||
|
grid;
|
||||||
|
pngname=sprintf("%s_postfilter_2", samname);
|
||||||
|
png(pngname);
|
||||||
|
endfunction
|
||||||
|
|
37
libs/libcodec2/octave/pulse.m
Normal file
37
libs/libcodec2/octave/pulse.m
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
% pulse.m
|
||||||
|
% David Rowe August 2009
|
||||||
|
%
|
||||||
|
% Experiments with human pulse perception for sinusoidal codecs
|
||||||
|
|
||||||
|
function pulse(samname)
|
||||||
|
|
||||||
|
A = 1000;
|
||||||
|
K = 16000;
|
||||||
|
N = 80;
|
||||||
|
frames = K/N;
|
||||||
|
s = zeros(1,K);
|
||||||
|
|
||||||
|
for f=1:frames
|
||||||
|
% lets try placing np random pulses in every frame
|
||||||
|
|
||||||
|
P = 20 + (160-20)*rand(1,1);
|
||||||
|
Wo = 2*pi/P;
|
||||||
|
L = floor(pi/Wo);
|
||||||
|
sf = zeros(1,N);
|
||||||
|
for m=1:L/2:L
|
||||||
|
pos = floor(rand(1,1)*N)+1;
|
||||||
|
%pos = 50;
|
||||||
|
for l=m:m+L/2-1
|
||||||
|
sf = sf + A*cos(l*Wo*((f-1)*N+1:f*N) - pos*l*Wo);
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
s((f-1)*N+1:f*N) = sf;
|
||||||
|
endfor
|
||||||
|
|
||||||
|
plot(s(1:250));
|
||||||
|
|
||||||
|
fs=fopen(samname,"wb");
|
||||||
|
fwrite(fs,s,"short");
|
||||||
|
fclose(fs);
|
||||||
|
endfunction
|
||||||
|
|
298
libs/libcodec2/pitch/hts1a.p
Normal file
298
libs/libcodec2/pitch/hts1a.p
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
111.627907
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
87.272736
|
||||||
|
78.048775
|
||||||
|
112.280701
|
||||||
|
120.000008
|
||||||
|
61.538464
|
||||||
|
68.817207
|
||||||
|
84.210526
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
101.587303
|
||||||
|
80.000000
|
||||||
|
72.727272
|
||||||
|
95.522392
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
101.587303
|
||||||
|
90.140846
|
||||||
|
85.333336
|
||||||
|
86.486488
|
||||||
|
91.428574
|
||||||
|
91.428574
|
||||||
|
91.428574
|
||||||
|
91.428574
|
||||||
|
91.428574
|
||||||
|
90.140846
|
||||||
|
86.486488
|
||||||
|
86.486488
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
81.012657
|
||||||
|
74.418610
|
||||||
|
71.111115
|
||||||
|
71.111115
|
||||||
|
71.111115
|
||||||
|
71.111115
|
||||||
|
68.085106
|
||||||
|
68.085106
|
||||||
|
67.368423
|
||||||
|
67.368423
|
||||||
|
70.329674
|
||||||
|
70.329674
|
||||||
|
70.329674
|
||||||
|
71.111115
|
||||||
|
74.418610
|
||||||
|
74.418610
|
||||||
|
75.294121
|
||||||
|
79.012352
|
||||||
|
85.333336
|
||||||
|
96.969704
|
||||||
|
111.627907
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
111.627907
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
112.280701
|
||||||
|
112.280701
|
||||||
|
96.969704
|
||||||
|
96.969704
|
||||||
|
96.969704
|
||||||
|
110.344841
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
120.000008
|
||||||
|
104.347832
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
83.116882
|
||||||
|
75.294121
|
||||||
|
71.910118
|
||||||
|
71.910110
|
||||||
|
71.910110
|
||||||
|
71.910110
|
||||||
|
75.294121
|
||||||
|
76.190483
|
||||||
|
80.000008
|
||||||
|
80.000008
|
||||||
|
84.210526
|
||||||
|
85.333336
|
||||||
|
90.140846
|
||||||
|
101.587303
|
||||||
|
108.474571
|
||||||
|
104.347832
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
71.111115
|
||||||
|
88.888893
|
||||||
|
75.294121
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
111.627907
|
||||||
|
111.627907
|
||||||
|
111.627907
|
||||||
|
97.959183
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
120.000008
|
||||||
|
111.627907
|
||||||
|
111.627907
|
||||||
|
86.486488
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
90.140846
|
||||||
|
95.522392
|
||||||
|
101.587311
|
||||||
|
101.587311
|
||||||
|
104.918037
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
111.627907
|
||||||
|
88.888893
|
||||||
|
80.000000
|
||||||
|
81.012657
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
86.486488
|
||||||
|
91.428574
|
||||||
|
90.140846
|
||||||
|
91.428574
|
||||||
|
96.969704
|
||||||
|
96.969704
|
||||||
|
95.522392
|
||||||
|
95.522392
|
||||||
|
95.522392
|
||||||
|
96.969704
|
||||||
|
96.969704
|
||||||
|
98.461533
|
||||||
|
104.918022
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
77.108429
|
||||||
|
79.012344
|
||||||
|
75.294121
|
||||||
|
75.294121
|
||||||
|
76.190483
|
||||||
|
76.190483
|
||||||
|
80.000008
|
||||||
|
81.012657
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
85.333336
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
91.428574
|
||||||
|
96.969704
|
||||||
|
98.461533
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
104.918037
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
104.347832
|
||||||
|
92.307693
|
||||||
|
72.727272
|
||||||
|
72.727272
|
||||||
|
76.190483
|
||||||
|
84.210533
|
||||||
|
88.888901
|
||||||
|
120.000008
|
||||||
|
104.347832
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
111.627907
|
||||||
|
92.307693
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
104.347832
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
84.210526
|
||||||
|
94.117653
|
||||||
|
96.969704
|
||||||
|
110.344841
|
||||||
|
120.000008
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
104.347832
|
||||||
|
97.959183
|
||||||
|
97.959183
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
98.461533
|
||||||
|
98.461533
|
||||||
|
104.918022
|
||||||
|
111.627907
|
||||||
|
111.627907
|
||||||
|
92.307693
|
||||||
|
97.959183
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
92.307693
|
||||||
|
57.657658
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
95.522392
|
||||||
|
101.587311
|
||||||
|
101.587311
|
||||||
|
108.474586
|
||||||
|
111.627907
|
||||||
|
97.959183
|
||||||
|
111.627907
|
||||||
|
120.000008
|
||||||
|
92.307693
|
||||||
|
74.418610
|
||||||
|
74.418610
|
||||||
|
74.418610
|
||||||
|
74.418610
|
||||||
|
76.190483
|
||||||
|
72.727280
|
||||||
|
76.190483
|
||||||
|
76.190483
|
||||||
|
69.565224
|
||||||
|
66.666672
|
||||||
|
54.700855
|
||||||
|
56.637169
|
||||||
|
56.637169
|
||||||
|
71.910110
|
||||||
|
90.140846
|
||||||
|
90.140846
|
||||||
|
72.727272
|
||||||
|
72.727272
|
||||||
|
72.727272
|
||||||
|
72.727272
|
||||||
|
55.172413
|
||||||
|
57.142857
|
||||||
|
55.172413
|
||||||
|
90.140846
|
||||||
|
95.522392
|
||||||
|
101.587311
|
||||||
|
101.587311
|
||||||
|
71.910110
|
||||||
|
74.418610
|
||||||
|
46.376812
|
||||||
|
40.000000
|
||||||
|
95.522392
|
||||||
|
0
|
||||||
|
0
|
300
libs/libcodec2/pitch/hts2a.p
Normal file
300
libs/libcodec2/pitch/hts2a.p
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
0.0000000e+000
|
||||||
|
9.2753623e+001
|
||||||
|
5.4237288e+001
|
||||||
|
8.5906040e+001
|
||||||
|
7.0329670e+001
|
||||||
|
5.5652174e+001
|
||||||
|
5.4237288e+001
|
||||||
|
5.4935622e+001
|
||||||
|
5.4700855e+001
|
||||||
|
7.5739645e+001
|
||||||
|
7.3563218e+001
|
||||||
|
1.2307692e+002
|
||||||
|
1.1428571e+002
|
||||||
|
7.3563218e+001
|
||||||
|
7.7108434e+001
|
||||||
|
1.8550725e+002
|
||||||
|
1.2673267e+002
|
||||||
|
1.0847458e+002
|
||||||
|
7.8527607e+001
|
||||||
|
8.8888889e+001
|
||||||
|
8.3116883e+001
|
||||||
|
8.1012658e+001
|
||||||
|
1.0756303e+002
|
||||||
|
1.3061224e+002
|
||||||
|
4.8301887e+001
|
||||||
|
4.7940075e+001
|
||||||
|
4.8120301e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9420849e+001
|
||||||
|
4.6886447e+001
|
||||||
|
4.2953020e+001
|
||||||
|
3.9263804e+001
|
||||||
|
3.7869822e+001
|
||||||
|
3.5457064e+001
|
||||||
|
3.4224599e+001
|
||||||
|
3.3333333e+001
|
||||||
|
3.2820513e+001
|
||||||
|
3.2000000e+001
|
||||||
|
3.1295844e+001
|
||||||
|
2.9906542e+001
|
||||||
|
2.9493088e+001
|
||||||
|
2.9090909e+001
|
||||||
|
2.8699552e+001
|
||||||
|
2.8131868e+001
|
||||||
|
2.7826087e+001
|
||||||
|
2.7826087e+001
|
||||||
|
2.7826087e+001
|
||||||
|
2.8193833e+001
|
||||||
|
2.7467811e+001
|
||||||
|
2.6890756e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.4237288e+001
|
||||||
|
6.4974619e+001
|
||||||
|
1.0756303e+002
|
||||||
|
8.8888889e+001
|
||||||
|
1.0406504e+002
|
||||||
|
4.4599303e+001
|
||||||
|
5.4468085e+001
|
||||||
|
3.6260623e+001
|
||||||
|
3.6260623e+001
|
||||||
|
8.1012658e+001
|
||||||
|
7.0329670e+001
|
||||||
|
1.2929293e+002
|
||||||
|
9.9224806e+001
|
||||||
|
4.3097643e+001
|
||||||
|
4.4137931e+001
|
||||||
|
4.5714286e+001
|
||||||
|
4.7407407e+001
|
||||||
|
4.8301887e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9420849e+001
|
||||||
|
5.0996016e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.2244898e+001
|
||||||
|
5.2459016e+001
|
||||||
|
5.2459016e+001
|
||||||
|
5.2244898e+001
|
||||||
|
5.3333333e+001
|
||||||
|
5.2459016e+001
|
||||||
|
5.2244898e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.1200000e+001
|
||||||
|
5.0996016e+001
|
||||||
|
5.0196078e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9420849e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9042146e+001
|
||||||
|
9.8461538e+001
|
||||||
|
1.0158730e+002
|
||||||
|
5.1821862e+001
|
||||||
|
9.0140845e+001
|
||||||
|
1.0491803e+002
|
||||||
|
1.4382022e+002
|
||||||
|
5.2459016e+001
|
||||||
|
5.2459016e+001
|
||||||
|
1.2929293e+002
|
||||||
|
1.6410256e+002
|
||||||
|
8.0000000e+001
|
||||||
|
7.3563218e+001
|
||||||
|
1.0158730e+002
|
||||||
|
9.9224806e+001
|
||||||
|
4.9042146e+001
|
||||||
|
4.9042146e+001
|
||||||
|
4.9042146e+001
|
||||||
|
5.9259259e+001
|
||||||
|
1.4382022e+002
|
||||||
|
7.2316384e+001
|
||||||
|
1.0847458e+002
|
||||||
|
1.1228070e+002
|
||||||
|
1.6202532e+002
|
||||||
|
8.1528662e+001
|
||||||
|
7.2727273e+001
|
||||||
|
1.8550725e+002
|
||||||
|
6.0093897e+001
|
||||||
|
1.0847458e+002
|
||||||
|
8.9510490e+001
|
||||||
|
7.1508380e+001
|
||||||
|
4.0125392e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0251572e+001
|
||||||
|
4.0506329e+001
|
||||||
|
4.3986254e+001
|
||||||
|
4.0506329e+001
|
||||||
|
9.8461538e+001
|
||||||
|
5.6140351e+001
|
||||||
|
6.5641026e+001
|
||||||
|
5.4237288e+001
|
||||||
|
1.1636364e+002
|
||||||
|
3.4316354e+001
|
||||||
|
3.4972678e+001
|
||||||
|
3.7758112e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0506329e+001
|
||||||
|
4.1290323e+001
|
||||||
|
4.2524917e+001
|
||||||
|
4.3389831e+001
|
||||||
|
4.4599303e+001
|
||||||
|
4.4912281e+001
|
||||||
|
4.6545455e+001
|
||||||
|
4.7232472e+001
|
||||||
|
4.8301887e+001
|
||||||
|
4.9230769e+001
|
||||||
|
4.9420849e+001
|
||||||
|
5.0393701e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.3333333e+001
|
||||||
|
5.3112033e+001
|
||||||
|
1.1034483e+002
|
||||||
|
9.7709924e+001
|
||||||
|
1.4382022e+002
|
||||||
|
5.0996016e+001
|
||||||
|
5.1821862e+001
|
||||||
|
5.0996016e+001
|
||||||
|
5.2032520e+001
|
||||||
|
5.3112033e+001
|
||||||
|
5.3556485e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.5652174e+001
|
||||||
|
5.4700855e+001
|
||||||
|
5.4700855e+001
|
||||||
|
5.4935622e+001
|
||||||
|
5.4700855e+001
|
||||||
|
5.4700855e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.4468085e+001
|
||||||
|
5.3333333e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.0996016e+001
|
||||||
|
5.0000000e+001
|
||||||
|
4.8120301e+001
|
||||||
|
4.8669202e+001
|
||||||
|
4.7058824e+001
|
||||||
|
4.6376812e+001
|
||||||
|
4.5070423e+001
|
||||||
|
4.4912281e+001
|
||||||
|
4.4137931e+001
|
||||||
|
4.2809365e+001
|
||||||
|
4.2666667e+001
|
||||||
|
4.2105263e+001
|
||||||
|
4.1423948e+001
|
||||||
|
4.1290323e+001
|
||||||
|
4.1290323e+001
|
||||||
|
4.1290323e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0634921e+001
|
||||||
|
4.0764331e+001
|
||||||
|
4.1423948e+001
|
||||||
|
4.2953020e+001
|
||||||
|
4.5551601e+001
|
||||||
|
1.7534247e+002
|
||||||
|
4.7232472e+001
|
||||||
|
1.3763441e+002
|
||||||
|
1.3061224e+002
|
||||||
|
4.5551601e+001
|
||||||
|
4.3686007e+001
|
||||||
|
4.8669202e+001
|
||||||
|
9.4117647e+001
|
||||||
|
8.1012658e+001
|
||||||
|
1.1228070e+002
|
||||||
|
1.3617021e+002
|
||||||
|
4.3097643e+001
|
||||||
|
4.3835616e+001
|
||||||
|
4.6376812e+001
|
||||||
|
4.6545455e+001
|
||||||
|
4.6043165e+001
|
||||||
|
4.8301887e+001
|
||||||
|
4.9042146e+001
|
||||||
|
4.9420849e+001
|
||||||
|
5.1200000e+001
|
||||||
|
5.1405622e+001
|
||||||
|
5.2244898e+001
|
||||||
|
1.2929293e+002
|
||||||
|
1.2929293e+002
|
||||||
|
1.5238095e+002
|
||||||
|
1.5238095e+002
|
||||||
|
1.3913043e+002
|
||||||
|
9.0140845e+001
|
||||||
|
1.0940171e+002
|
||||||
|
9.0140845e+001
|
||||||
|
1.2307692e+002
|
||||||
|
8.9510490e+001
|
||||||
|
6.9565217e+001
|
||||||
|
7.3142857e+001
|
||||||
|
1.1034483e+002
|
||||||
|
7.8048780e+001
|
||||||
|
7.2727273e+001
|
||||||
|
1.0078740e+002
|
||||||
|
1.0940171e+002
|
||||||
|
1.1743119e+002
|
||||||
|
8.7074830e+001
|
||||||
|
1.8550725e+002
|
||||||
|
6.5306122e+001
|
||||||
|
1.3617021e+002
|
||||||
|
5.2674897e+001
|
||||||
|
1.0940171e+002
|
||||||
|
1.5238095e+002
|
||||||
|
1.4065934e+002
|
||||||
|
1.0756303e+002
|
||||||
|
1.0406504e+002
|
||||||
|
5.0793651e+001
|
||||||
|
4.9420849e+001
|
||||||
|
4.4444444e+001
|
||||||
|
7.0329670e+001
|
||||||
|
7.2727273e+001
|
||||||
|
7.4418605e+001
|
||||||
|
1.1636364e+002
|
||||||
|
1.0406504e+002
|
||||||
|
1.2307692e+002
|
||||||
|
1.2549020e+002
|
||||||
|
1.7297297e+002
|
||||||
|
4.5878136e+001
|
||||||
|
4.9805447e+001
|
||||||
|
6.2745098e+001
|
||||||
|
9.2086331e+001
|
||||||
|
9.1428571e+001
|
||||||
|
5.7142857e+001
|
||||||
|
4.8484848e+001
|
||||||
|
4.1157556e+001
|
||||||
|
2.2857143e+001
|
||||||
|
3.0046948e+001
|
||||||
|
9.4814815e+001
|
||||||
|
5.7918552e+001
|
||||||
|
9.0140845e+001
|
||||||
|
7.4418605e+001
|
||||||
|
7.4418605e+001
|
||||||
|
5.4700855e+001
|
||||||
|
9.5522388e+001
|
||||||
|
7.4853801e+001
|
||||||
|
9.4117647e+001
|
||||||
|
9.5522388e+001
|
||||||
|
9.9224806e+001
|
||||||
|
8.1012658e+001
|
||||||
|
1.1851852e+002
|
||||||
|
6.8817204e+001
|
||||||
|
8.5906040e+001
|
||||||
|
6.7015707e+001
|
||||||
|
4.3537415e+001
|
||||||
|
6.5306122e+001
|
||||||
|
3.1295844e+001
|
||||||
|
7.5739645e+001
|
||||||
|
6.2135922e+001
|
||||||
|
9.9224806e+001
|
||||||
|
5.7657658e+001
|
||||||
|
5.2244898e+001
|
||||||
|
5.8447489e+001
|
||||||
|
0.0000000e+000
|
||||||
|
0.0000000e+000
|
||||||
|
0.0000000e+000
|
||||||
|
0.0000000e+000
|
||||||
|
0.0000000e+000
|
BIN
libs/libcodec2/raw/b0067.raw
Normal file
BIN
libs/libcodec2/raw/b0067.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/f2400.raw
Normal file
BIN
libs/libcodec2/raw/f2400.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/forig.raw
Normal file
BIN
libs/libcodec2/raw/forig.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/forig_g729a.raw
Normal file
BIN
libs/libcodec2/raw/forig_g729a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/forig_gsm13k.raw
Normal file
BIN
libs/libcodec2/raw/forig_gsm13k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/forig_speex_8k.raw
Normal file
BIN
libs/libcodec2/raw/forig_speex_8k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts.raw
Normal file
BIN
libs/libcodec2/raw/hts.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts1.raw
Normal file
BIN
libs/libcodec2/raw/hts1.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts1a.raw
Normal file
BIN
libs/libcodec2/raw/hts1a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts1a_g729a.raw
Normal file
BIN
libs/libcodec2/raw/hts1a_g729a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts1a_gsm13k.raw
Normal file
BIN
libs/libcodec2/raw/hts1a_gsm13k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts1a_speex_8k.raw
Normal file
BIN
libs/libcodec2/raw/hts1a_speex_8k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts2.raw
Normal file
BIN
libs/libcodec2/raw/hts2.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts2a.raw
Normal file
BIN
libs/libcodec2/raw/hts2a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts2a_g729a.raw
Normal file
BIN
libs/libcodec2/raw/hts2a_g729a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts2a_gsm13k.raw
Normal file
BIN
libs/libcodec2/raw/hts2a_gsm13k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/hts2a_speex_8k.raw
Normal file
BIN
libs/libcodec2/raw/hts2a_speex_8k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/m2400.raw
Normal file
BIN
libs/libcodec2/raw/m2400.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/mmt1.raw
Normal file
BIN
libs/libcodec2/raw/mmt1.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/mmt1_g729a.raw
Normal file
BIN
libs/libcodec2/raw/mmt1_g729a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/mmt1_gsm13k.raw
Normal file
BIN
libs/libcodec2/raw/mmt1_gsm13k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/mmt1_speex_8k.raw
Normal file
BIN
libs/libcodec2/raw/mmt1_speex_8k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/morig.raw
Normal file
BIN
libs/libcodec2/raw/morig.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/morig_g729a.raw
Normal file
BIN
libs/libcodec2/raw/morig_g729a.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/morig_gsm13k.raw
Normal file
BIN
libs/libcodec2/raw/morig_gsm13k.raw
Normal file
Binary file not shown.
BIN
libs/libcodec2/raw/morig_speex_8k.raw
Normal file
BIN
libs/libcodec2/raw/morig_speex_8k.raw
Normal file
Binary file not shown.
70
libs/libcodec2/script/menu.sh
Executable file
70
libs/libcodec2/script/menu.sh
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ./menu.sh
|
||||||
|
#
|
||||||
|
# David Rowe
|
||||||
|
# Created August 2009
|
||||||
|
#
|
||||||
|
# Presents a menu of sound files, press 1 to play file1, 2 to play file2 etc
|
||||||
|
#
|
||||||
|
# The aim is to make comparing files with different processing easier than
|
||||||
|
# using up-arrow on the command line. Based on cdialog.
|
||||||
|
#
|
||||||
|
# usage:
|
||||||
|
# menu.sh file1.raw file2.raw ........ [-d playbackdevice]
|
||||||
|
#
|
||||||
|
# for example:
|
||||||
|
#
|
||||||
|
# ../script/menu.sh hts1a.raw hts1a_uq.raw
|
||||||
|
#
|
||||||
|
# or:
|
||||||
|
#
|
||||||
|
# ../script/menu.sh hts1a.raw hts1a_uq.raw -d /dev/dsp1
|
||||||
|
#
|
||||||
|
|
||||||
|
# Copyright (C) 2007 David Rowe
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License version 2, as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
files=0
|
||||||
|
items="Q-Quit\n"
|
||||||
|
while [ ! -z "$1" ]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-d) dsp="${1} ${2}"; shift;;
|
||||||
|
*) files=`expr 1 + $files`;
|
||||||
|
new_file=$1;
|
||||||
|
file[$files]=$new_file;
|
||||||
|
items="${items} ${files}-${new_file}\n";;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
readchar=1
|
||||||
|
echo -n -e "\r" $items"- "
|
||||||
|
while [ $readchar -ne 0 ]
|
||||||
|
do
|
||||||
|
echo -n -e "\r -"
|
||||||
|
stty cbreak # or stty raw
|
||||||
|
readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
|
||||||
|
stty -cbreak
|
||||||
|
if [ $readchar == 'q' ] ; then
|
||||||
|
readchar=0
|
||||||
|
fi
|
||||||
|
if [ $readchar -ne 0 ] ; then
|
||||||
|
play -r 8000 -s -2 ${file[$readchar]} $dsp 2> /dev/null
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo
|
6
libs/libcodec2/script/playraw.sh
Executable file
6
libs/libcodec2/script/playraw.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Plays a raw file
|
||||||
|
# usage:
|
||||||
|
# playraw file.raw
|
||||||
|
# playraw file.raw -d /dev/dsp1 (e.g. for USB headphones)
|
||||||
|
play -r 8000 -s -2 $1 $2 $3
|
3
libs/libcodec2/script/raw2wav.sh
Executable file
3
libs/libcodec2/script/raw2wav.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Converts 16 bit signed short 8 kHz raw (headerless) files to wave
|
||||||
|
sox -r 8000 -s -2 $1 $2
|
3
libs/libcodec2/script/wav2raw.sh
Executable file
3
libs/libcodec2/script/wav2raw.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Converts wave files to raw (headerless) files
|
||||||
|
sox $1 -t raw $2
|
53
libs/libcodec2/src/Makefile.am
Normal file
53
libs/libcodec2/src/Makefile.am
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
AM_CFLAGS = -I../src -Wall -DFLOATING_POINT -DVAR_ARRAYS
|
||||||
|
AUTOMAKE_OPTS = gnu
|
||||||
|
NAME = libcodec2
|
||||||
|
AM_CPPFLAGS = $(AM_CFLAGS)
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libcodec2.la
|
||||||
|
libcodec2_la_SOURCES = dump.c \
|
||||||
|
lpc.c \
|
||||||
|
nlp.c \
|
||||||
|
postfilter.c \
|
||||||
|
sine.c \
|
||||||
|
codec2.c \
|
||||||
|
four1.c \
|
||||||
|
interp.c \
|
||||||
|
lsp.c \
|
||||||
|
phase.c \
|
||||||
|
quantise.c \
|
||||||
|
pack.c \
|
||||||
|
codebook.c
|
||||||
|
|
||||||
|
libcodec2_la_CFLAGS = $(AM_CFLAGS)
|
||||||
|
libcodec2_la_LDFLAGS = $(LIBS)
|
||||||
|
|
||||||
|
library_includedir = $(prefix)
|
||||||
|
library_include_HEADERS = codec2.h \
|
||||||
|
defines.h \
|
||||||
|
four1.h \
|
||||||
|
interp.h \
|
||||||
|
lsp.h \
|
||||||
|
phase.h \
|
||||||
|
quantise.h \
|
||||||
|
comp.h \
|
||||||
|
dump.h \
|
||||||
|
globals.h \
|
||||||
|
lpc.h \
|
||||||
|
nlp.h \
|
||||||
|
postfilter.h \
|
||||||
|
sine.h \
|
||||||
|
codebook.h
|
||||||
|
|
||||||
|
bin_PROGRAMS = c2dec c2enc c2sim
|
||||||
|
|
||||||
|
c2dec_SOURCES = c2dec.c
|
||||||
|
c2dec_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2dec_LDFLAGS = $(LIBS)
|
||||||
|
|
||||||
|
c2enc_SOURCES = c2enc.c
|
||||||
|
c2enc_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2enc_LDFLAGS = $(LIBS)
|
||||||
|
|
||||||
|
c2sim_SOURCES = c2sim.c
|
||||||
|
c2sim_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2sim_LDFLAGS = $(LIBS)
|
690
libs/libcodec2/src/Makefile.in
Normal file
690
libs/libcodec2/src/Makefile.in
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
# Makefile.in generated by automake 1.9.6 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
top_builddir = ..
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
bin_PROGRAMS = c2dec$(EXEEXT) c2enc$(EXEEXT) c2sim$(EXEEXT)
|
||||||
|
subdir = src
|
||||||
|
DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/configure.in
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
|
||||||
|
"$(DESTDIR)$(library_includedir)"
|
||||||
|
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
libcodec2_la_LIBADD =
|
||||||
|
am_libcodec2_la_OBJECTS = libcodec2_la-dump.lo libcodec2_la-lpc.lo \
|
||||||
|
libcodec2_la-nlp.lo libcodec2_la-postfilter.lo \
|
||||||
|
libcodec2_la-sine.lo libcodec2_la-codec2.lo \
|
||||||
|
libcodec2_la-four1.lo libcodec2_la-interp.lo \
|
||||||
|
libcodec2_la-lsp.lo libcodec2_la-phase.lo \
|
||||||
|
libcodec2_la-quantise.lo libcodec2_la-pack.lo \
|
||||||
|
libcodec2_la-codebook.lo
|
||||||
|
libcodec2_la_OBJECTS = $(am_libcodec2_la_OBJECTS)
|
||||||
|
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
|
||||||
|
PROGRAMS = $(bin_PROGRAMS)
|
||||||
|
am_c2dec_OBJECTS = c2dec.$(OBJEXT)
|
||||||
|
c2dec_OBJECTS = $(am_c2dec_OBJECTS)
|
||||||
|
am__DEPENDENCIES_1 = libcodec2.la
|
||||||
|
c2dec_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
|
am_c2enc_OBJECTS = c2enc.$(OBJEXT)
|
||||||
|
c2enc_OBJECTS = $(am_c2enc_OBJECTS)
|
||||||
|
c2enc_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
|
am_c2sim_OBJECTS = c2sim.$(OBJEXT)
|
||||||
|
c2sim_OBJECTS = $(am_c2sim_OBJECTS)
|
||||||
|
c2sim_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
|
DEFAULT_INCLUDES = -I. -I$(srcdir)
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
|
||||||
|
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||||
|
$(AM_CFLAGS) $(CFLAGS)
|
||||||
|
CCLD = $(CC)
|
||||||
|
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
SOURCES = $(libcodec2_la_SOURCES) $(c2dec_SOURCES) $(c2enc_SOURCES) \
|
||||||
|
$(c2sim_SOURCES)
|
||||||
|
DIST_SOURCES = $(libcodec2_la_SOURCES) $(c2dec_SOURCES) \
|
||||||
|
$(c2enc_SOURCES) $(c2sim_SOURCES)
|
||||||
|
library_includeHEADERS_INSTALL = $(INSTALL_HEADER)
|
||||||
|
HEADERS = $(library_include_HEADERS)
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMDEP_FALSE = @AMDEP_FALSE@
|
||||||
|
AMDEP_TRUE = @AMDEP_TRUE@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO = @ECHO@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
F77 = @F77@
|
||||||
|
FFLAGS = @FFLAGS@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_F77 = @ac_ct_F77@
|
||||||
|
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||||
|
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||||
|
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||||
|
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
AM_CFLAGS = -I../src -Wall -DFLOATING_POINT -DVAR_ARRAYS
|
||||||
|
AUTOMAKE_OPTS = gnu
|
||||||
|
NAME = libcodec2
|
||||||
|
AM_CPPFLAGS = $(AM_CFLAGS)
|
||||||
|
lib_LTLIBRARIES = libcodec2.la
|
||||||
|
libcodec2_la_SOURCES = dump.c \
|
||||||
|
lpc.c \
|
||||||
|
nlp.c \
|
||||||
|
postfilter.c \
|
||||||
|
sine.c \
|
||||||
|
codec2.c \
|
||||||
|
four1.c \
|
||||||
|
interp.c \
|
||||||
|
lsp.c \
|
||||||
|
phase.c \
|
||||||
|
quantise.c \
|
||||||
|
pack.c \
|
||||||
|
codebook.c
|
||||||
|
|
||||||
|
libcodec2_la_CFLAGS = $(AM_CFLAGS)
|
||||||
|
libcodec2_la_LDFLAGS = $(LIBS)
|
||||||
|
library_includedir = $(prefix)
|
||||||
|
library_include_HEADERS = codec2.h \
|
||||||
|
defines.h \
|
||||||
|
four1.h \
|
||||||
|
interp.h \
|
||||||
|
lsp.h \
|
||||||
|
phase.h \
|
||||||
|
quantise.h \
|
||||||
|
comp.h \
|
||||||
|
dump.h \
|
||||||
|
globals.h \
|
||||||
|
lpc.h \
|
||||||
|
nlp.h \
|
||||||
|
postfilter.h \
|
||||||
|
sine.h \
|
||||||
|
codebook.h
|
||||||
|
|
||||||
|
c2dec_SOURCES = c2dec.c
|
||||||
|
c2dec_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2dec_LDFLAGS = $(LIBS)
|
||||||
|
c2enc_SOURCES = c2enc.c
|
||||||
|
c2enc_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2enc_LDFLAGS = $(LIBS)
|
||||||
|
c2sim_SOURCES = c2sim.c
|
||||||
|
c2sim_LDADD = $(lib_LTLIBRARIES)
|
||||||
|
c2sim_LDFLAGS = $(LIBS)
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu src/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
f=$(am__strip_dir) \
|
||||||
|
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
|
||||||
|
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
|
||||||
|
else :; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
p=$(am__strip_dir) \
|
||||||
|
echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
|
||||||
|
$(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES:
|
||||||
|
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||||
|
test "$$dir" != "$$p" || dir=.; \
|
||||||
|
echo "rm -f \"$${dir}/so_locations\""; \
|
||||||
|
rm -f "$${dir}/so_locations"; \
|
||||||
|
done
|
||||||
|
libcodec2.la: $(libcodec2_la_OBJECTS) $(libcodec2_la_DEPENDENCIES)
|
||||||
|
$(LINK) -rpath $(libdir) $(libcodec2_la_LDFLAGS) $(libcodec2_la_OBJECTS) $(libcodec2_la_LIBADD) $(LIBS)
|
||||||
|
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
|
||||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||||
|
p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||||
|
if test -f $$p \
|
||||||
|
|| test -f $$p1 \
|
||||||
|
; then \
|
||||||
|
f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||||
|
echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
|
||||||
|
$(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
|
||||||
|
else :; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-binPROGRAMS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||||
|
f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
|
||||||
|
echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
|
||||||
|
rm -f "$(DESTDIR)$(bindir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-binPROGRAMS:
|
||||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||||
|
f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||||
|
echo " rm -f $$p $$f"; \
|
||||||
|
rm -f $$p $$f ; \
|
||||||
|
done
|
||||||
|
c2dec$(EXEEXT): $(c2dec_OBJECTS) $(c2dec_DEPENDENCIES)
|
||||||
|
@rm -f c2dec$(EXEEXT)
|
||||||
|
$(LINK) $(c2dec_LDFLAGS) $(c2dec_OBJECTS) $(c2dec_LDADD) $(LIBS)
|
||||||
|
c2enc$(EXEEXT): $(c2enc_OBJECTS) $(c2enc_DEPENDENCIES)
|
||||||
|
@rm -f c2enc$(EXEEXT)
|
||||||
|
$(LINK) $(c2enc_LDFLAGS) $(c2enc_OBJECTS) $(c2enc_LDADD) $(LIBS)
|
||||||
|
c2sim$(EXEEXT): $(c2sim_OBJECTS) $(c2sim_DEPENDENCIES)
|
||||||
|
@rm -f c2sim$(EXEEXT)
|
||||||
|
$(LINK) $(c2sim_LDFLAGS) $(c2sim_OBJECTS) $(c2sim_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c2dec.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c2enc.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c2sim.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebook.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codec2.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-dump.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-four1.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-interp.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-lpc.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-lsp.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-nlp.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-pack.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-phase.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-postfilter.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-quantise.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-sine.Plo@am__quote@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
libcodec2_la-dump.lo: dump.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-dump.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-dump.Tpo" -c -o libcodec2_la-dump.lo `test -f 'dump.c' || echo '$(srcdir)/'`dump.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-dump.Tpo" "$(DEPDIR)/libcodec2_la-dump.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-dump.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dump.c' object='libcodec2_la-dump.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-dump.lo `test -f 'dump.c' || echo '$(srcdir)/'`dump.c
|
||||||
|
|
||||||
|
libcodec2_la-lpc.lo: lpc.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-lpc.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-lpc.Tpo" -c -o libcodec2_la-lpc.lo `test -f 'lpc.c' || echo '$(srcdir)/'`lpc.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-lpc.Tpo" "$(DEPDIR)/libcodec2_la-lpc.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-lpc.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lpc.c' object='libcodec2_la-lpc.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-lpc.lo `test -f 'lpc.c' || echo '$(srcdir)/'`lpc.c
|
||||||
|
|
||||||
|
libcodec2_la-nlp.lo: nlp.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-nlp.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-nlp.Tpo" -c -o libcodec2_la-nlp.lo `test -f 'nlp.c' || echo '$(srcdir)/'`nlp.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-nlp.Tpo" "$(DEPDIR)/libcodec2_la-nlp.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-nlp.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nlp.c' object='libcodec2_la-nlp.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-nlp.lo `test -f 'nlp.c' || echo '$(srcdir)/'`nlp.c
|
||||||
|
|
||||||
|
libcodec2_la-postfilter.lo: postfilter.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-postfilter.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-postfilter.Tpo" -c -o libcodec2_la-postfilter.lo `test -f 'postfilter.c' || echo '$(srcdir)/'`postfilter.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-postfilter.Tpo" "$(DEPDIR)/libcodec2_la-postfilter.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-postfilter.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='postfilter.c' object='libcodec2_la-postfilter.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-postfilter.lo `test -f 'postfilter.c' || echo '$(srcdir)/'`postfilter.c
|
||||||
|
|
||||||
|
libcodec2_la-sine.lo: sine.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-sine.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-sine.Tpo" -c -o libcodec2_la-sine.lo `test -f 'sine.c' || echo '$(srcdir)/'`sine.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-sine.Tpo" "$(DEPDIR)/libcodec2_la-sine.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-sine.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sine.c' object='libcodec2_la-sine.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-sine.lo `test -f 'sine.c' || echo '$(srcdir)/'`sine.c
|
||||||
|
|
||||||
|
libcodec2_la-codec2.lo: codec2.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-codec2.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codec2.Tpo" -c -o libcodec2_la-codec2.lo `test -f 'codec2.c' || echo '$(srcdir)/'`codec2.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-codec2.Tpo" "$(DEPDIR)/libcodec2_la-codec2.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codec2.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codec2.c' object='libcodec2_la-codec2.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-codec2.lo `test -f 'codec2.c' || echo '$(srcdir)/'`codec2.c
|
||||||
|
|
||||||
|
libcodec2_la-four1.lo: four1.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-four1.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-four1.Tpo" -c -o libcodec2_la-four1.lo `test -f 'four1.c' || echo '$(srcdir)/'`four1.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-four1.Tpo" "$(DEPDIR)/libcodec2_la-four1.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-four1.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='four1.c' object='libcodec2_la-four1.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-four1.lo `test -f 'four1.c' || echo '$(srcdir)/'`four1.c
|
||||||
|
|
||||||
|
libcodec2_la-interp.lo: interp.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-interp.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-interp.Tpo" -c -o libcodec2_la-interp.lo `test -f 'interp.c' || echo '$(srcdir)/'`interp.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-interp.Tpo" "$(DEPDIR)/libcodec2_la-interp.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-interp.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='interp.c' object='libcodec2_la-interp.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-interp.lo `test -f 'interp.c' || echo '$(srcdir)/'`interp.c
|
||||||
|
|
||||||
|
libcodec2_la-lsp.lo: lsp.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-lsp.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-lsp.Tpo" -c -o libcodec2_la-lsp.lo `test -f 'lsp.c' || echo '$(srcdir)/'`lsp.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-lsp.Tpo" "$(DEPDIR)/libcodec2_la-lsp.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-lsp.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lsp.c' object='libcodec2_la-lsp.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-lsp.lo `test -f 'lsp.c' || echo '$(srcdir)/'`lsp.c
|
||||||
|
|
||||||
|
libcodec2_la-phase.lo: phase.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-phase.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-phase.Tpo" -c -o libcodec2_la-phase.lo `test -f 'phase.c' || echo '$(srcdir)/'`phase.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-phase.Tpo" "$(DEPDIR)/libcodec2_la-phase.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-phase.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='phase.c' object='libcodec2_la-phase.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-phase.lo `test -f 'phase.c' || echo '$(srcdir)/'`phase.c
|
||||||
|
|
||||||
|
libcodec2_la-quantise.lo: quantise.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-quantise.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-quantise.Tpo" -c -o libcodec2_la-quantise.lo `test -f 'quantise.c' || echo '$(srcdir)/'`quantise.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-quantise.Tpo" "$(DEPDIR)/libcodec2_la-quantise.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-quantise.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='quantise.c' object='libcodec2_la-quantise.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-quantise.lo `test -f 'quantise.c' || echo '$(srcdir)/'`quantise.c
|
||||||
|
|
||||||
|
libcodec2_la-pack.lo: pack.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-pack.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-pack.Tpo" -c -o libcodec2_la-pack.lo `test -f 'pack.c' || echo '$(srcdir)/'`pack.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-pack.Tpo" "$(DEPDIR)/libcodec2_la-pack.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-pack.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pack.c' object='libcodec2_la-pack.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-pack.lo `test -f 'pack.c' || echo '$(srcdir)/'`pack.c
|
||||||
|
|
||||||
|
libcodec2_la-codebook.lo: codebook.c
|
||||||
|
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-codebook.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebook.Tpo" -c -o libcodec2_la-codebook.lo `test -f 'codebook.c' || echo '$(srcdir)/'`codebook.c; \
|
||||||
|
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-codebook.Tpo" "$(DEPDIR)/libcodec2_la-codebook.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebook.Tpo"; exit 1; fi
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codebook.c' object='libcodec2_la-codebook.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-codebook.lo `test -f 'codebook.c' || echo '$(srcdir)/'`codebook.c
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool:
|
||||||
|
-rm -f libtool
|
||||||
|
uninstall-info-am:
|
||||||
|
install-library_includeHEADERS: $(library_include_HEADERS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(library_includedir)" || $(mkdir_p) "$(DESTDIR)$(library_includedir)"
|
||||||
|
@list='$(library_include_HEADERS)'; for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
f=$(am__strip_dir) \
|
||||||
|
echo " $(library_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(library_includedir)/$$f'"; \
|
||||||
|
$(library_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(library_includedir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-library_includeHEADERS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(library_include_HEADERS)'; for p in $$list; do \
|
||||||
|
f=$(am__strip_dir) \
|
||||||
|
echo " rm -f '$(DESTDIR)$(library_includedir)/$$f'"; \
|
||||||
|
rm -f "$(DESTDIR)$(library_includedir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$tags $$unique; \
|
||||||
|
fi
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& cd $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) $$here
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
|
||||||
|
list='$(DISTFILES)'; for file in $$list; do \
|
||||||
|
case $$file in \
|
||||||
|
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
||||||
|
esac; \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
||||||
|
dir="/$$dir"; \
|
||||||
|
$(mkdir_p) "$(distdir)$$dir"; \
|
||||||
|
else \
|
||||||
|
dir=''; \
|
||||||
|
fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
|
||||||
|
install-binPROGRAMS: install-libLTLIBRARIES
|
||||||
|
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(library_includedir)"; do \
|
||||||
|
test -z "$$dir" || $(mkdir_p) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
|
||||||
|
clean-libtool mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
|
distclean-libtool distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-library_includeHEADERS
|
||||||
|
|
||||||
|
install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -rf ./$(DEPDIR)
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||||
|
mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
|
||||||
|
uninstall-libLTLIBRARIES uninstall-library_includeHEADERS
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
|
||||||
|
clean-generic clean-libLTLIBRARIES clean-libtool ctags \
|
||||||
|
distclean distclean-compile distclean-generic \
|
||||||
|
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||||
|
html-am info info-am install install-am install-binPROGRAMS \
|
||||||
|
install-data install-data-am install-exec install-exec-am \
|
||||||
|
install-info install-info-am install-libLTLIBRARIES \
|
||||||
|
install-library_includeHEADERS install-man install-strip \
|
||||||
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||||
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
|
tags uninstall uninstall-am uninstall-binPROGRAMS \
|
||||||
|
uninstall-info-am uninstall-libLTLIBRARIES \
|
||||||
|
uninstall-library_includeHEADERS
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
80
libs/libcodec2/src/c2dec.c
Normal file
80
libs/libcodec2/src/c2dec.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: c2dec.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/8/2010
|
||||||
|
|
||||||
|
Decodes a file of bits to a file of raw speech samples using codec2. Demo
|
||||||
|
program for codec2.
|
||||||
|
|
||||||
|
NOTE: the bit file is not packed, 51 bits/frame actually consumes 51
|
||||||
|
bytes/frame on disk. If you are using this for a real world
|
||||||
|
application you may want to pack the 51 bytes into 7 bytes.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "codec2.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
static const int bitsSize = ((CODEC2_BITS_PER_FRAME + 7) / 8);
|
||||||
|
void *codec2;
|
||||||
|
FILE *fin;
|
||||||
|
FILE *fout;
|
||||||
|
short buf[CODEC2_SAMPLES_PER_FRAME];
|
||||||
|
unsigned char bits[bitsSize];
|
||||||
|
|
||||||
|
if (argc != 3) {
|
||||||
|
printf("usage: %s InputBitFile OutputRawSpeechFile\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fin = fopen(argv[1],"rb")) == NULL ) {
|
||||||
|
fprintf(stderr, "Error opening input bit file: %s: %s.\n",
|
||||||
|
argv[1], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fout = fopen(argv[2],"wb")) == NULL ) {
|
||||||
|
fprintf(stderr, "Error opening output speech file: %s: %s.\n",
|
||||||
|
argv[2], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
codec2 = codec2_create();
|
||||||
|
|
||||||
|
while(fread(bits, sizeof(char), bitsSize, fin) == bitsSize) {
|
||||||
|
codec2_decode(codec2, buf, bits);
|
||||||
|
fwrite(buf, sizeof(short), CODEC2_SAMPLES_PER_FRAME, fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
codec2_destroy(codec2);
|
||||||
|
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
82
libs/libcodec2/src/c2enc.c
Normal file
82
libs/libcodec2/src/c2enc.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: c2enc.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/8/2010
|
||||||
|
|
||||||
|
Encodes a file of raw speech samples using codec2 and ouputs a file
|
||||||
|
of bits (each bit is stored in the LSB or each output byte). Demo
|
||||||
|
program for codec2.
|
||||||
|
|
||||||
|
NOTE: the bit file is not packed, 51 bits/frame actually consumes 51
|
||||||
|
bytes/frame on disk. If you are using this for a real world
|
||||||
|
application you may want to pack the 51 bytes into 7 bytes.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "codec2.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
static const int bitsSize = ((CODEC2_BITS_PER_FRAME + 7) / 8);
|
||||||
|
void *codec2;
|
||||||
|
FILE *fin;
|
||||||
|
FILE *fout;
|
||||||
|
short buf[CODEC2_SAMPLES_PER_FRAME];
|
||||||
|
unsigned char bits[bitsSize];
|
||||||
|
|
||||||
|
if (argc != 3) {
|
||||||
|
printf("usage: %s InputRawspeechFile OutputBitFile\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fin = fopen(argv[1],"rb")) == NULL ) {
|
||||||
|
fprintf(stderr, "Error opening input bit file: %s: %s.\n",
|
||||||
|
argv[1], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (fout = fopen(argv[2],"wb")) == NULL ) {
|
||||||
|
fprintf(stderr, "Error opening output speech file: %s: %s.\n",
|
||||||
|
argv[2], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
codec2 = codec2_create();
|
||||||
|
|
||||||
|
while(fread(buf, sizeof(short), CODEC2_SAMPLES_PER_FRAME, fin) ==
|
||||||
|
CODEC2_SAMPLES_PER_FRAME) {
|
||||||
|
codec2_encode(codec2, bits, buf);
|
||||||
|
fwrite(bits, sizeof(char), bitsSize, fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
codec2_destroy(codec2);
|
||||||
|
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
408
libs/libcodec2/src/c2sim.c
Normal file
408
libs/libcodec2/src/c2sim.c
Normal file
@ -0,0 +1,408 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: c2sim.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 20/8/2010
|
||||||
|
|
||||||
|
Codec2 simulation. Combines encoder and decoder and allows switching in
|
||||||
|
out various algorithms and quantisation steps.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "sine.h"
|
||||||
|
#include "nlp.h"
|
||||||
|
#include "dump.h"
|
||||||
|
#include "lpc.h"
|
||||||
|
#include "lsp.h"
|
||||||
|
#include "quantise.h"
|
||||||
|
#include "phase.h"
|
||||||
|
#include "postfilter.h"
|
||||||
|
#include "interp.h"
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
switch_present()
|
||||||
|
|
||||||
|
Searches the command line arguments for a "switch". If the switch is
|
||||||
|
found, returns the command line argument where it ws found, else returns
|
||||||
|
NULL.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int switch_present(sw,argc,argv)
|
||||||
|
register char sw[]; /* switch in string form */
|
||||||
|
register int argc; /* number of command line arguments */
|
||||||
|
register char *argv[]; /* array of command line arguments in string form */
|
||||||
|
{
|
||||||
|
register int i; /* loop variable */
|
||||||
|
|
||||||
|
for(i=1; i<argc; i++)
|
||||||
|
if (!strcmp(sw,argv[i]))
|
||||||
|
return(i);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void synth_one_frame(short buf[], MODEL *model, float Sn_[], float Pn[]);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
MAIN
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
FILE *fout; /* output speech file */
|
||||||
|
FILE *fin; /* input speech file */
|
||||||
|
short buf[N]; /* input/output buffer */
|
||||||
|
float Sn[M]; /* float input speech samples */
|
||||||
|
COMP Sw[FFT_ENC]; /* DFT of Sn[] */
|
||||||
|
float w[M]; /* time domain hamming window */
|
||||||
|
COMP W[FFT_ENC]; /* DFT of w[] */
|
||||||
|
MODEL model;
|
||||||
|
float Pn[2*N]; /* trapezoidal synthesis window */
|
||||||
|
float Sn_[2*N]; /* synthesised speech */
|
||||||
|
int i; /* loop variable */
|
||||||
|
int frames;
|
||||||
|
float prev_Wo;
|
||||||
|
float pitch;
|
||||||
|
int voiced1;
|
||||||
|
|
||||||
|
char out_file[MAX_STR];
|
||||||
|
int arg;
|
||||||
|
float snr;
|
||||||
|
float sum_snr;
|
||||||
|
|
||||||
|
int lpc_model, order;
|
||||||
|
int lsp, lsp_quantiser;
|
||||||
|
float ak[LPC_MAX];
|
||||||
|
COMP Sw_[FFT_ENC];
|
||||||
|
|
||||||
|
int dump;
|
||||||
|
|
||||||
|
int phase0;
|
||||||
|
float ex_phase[MAX_AMP+1];
|
||||||
|
|
||||||
|
int postfilt;
|
||||||
|
float bg_est;
|
||||||
|
|
||||||
|
int hand_voicing;
|
||||||
|
FILE *fvoicing;
|
||||||
|
|
||||||
|
MODEL prev_model, interp_model;
|
||||||
|
int decimate;
|
||||||
|
|
||||||
|
void *nlp_states;
|
||||||
|
|
||||||
|
for(i=0; i<M; i++)
|
||||||
|
Sn[i] = 1.0;
|
||||||
|
for(i=0; i<2*N; i++)
|
||||||
|
Sn_[i] = 0;
|
||||||
|
|
||||||
|
prev_Wo = TWO_PI/P_MAX;
|
||||||
|
|
||||||
|
prev_model.Wo = TWO_PI/P_MIN;
|
||||||
|
prev_model.L = floor(PI/prev_model.Wo);
|
||||||
|
for(i=1; i<=prev_model.L; i++) {
|
||||||
|
prev_model.A[i] = 0.0;
|
||||||
|
prev_model.phi[i] = 0.0;
|
||||||
|
}
|
||||||
|
for(i=1; i<=MAX_AMP; i++) {
|
||||||
|
ex_phase[i] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nlp_states = nlp_create();
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "\nCodec2 - 2400 bit/s speech codec - Simulation Program\n"
|
||||||
|
"\thttp://rowetel.com/codec2.html\n\n"
|
||||||
|
"usage: %s InputFile [-o OutputFile]\n"
|
||||||
|
"\t[-o lpc Order]\n"
|
||||||
|
"\t[--lsp]\n"
|
||||||
|
"\t[--phase0]\n"
|
||||||
|
"\t[--postfilter]\n"
|
||||||
|
"\t[--hand_voicing]\n"
|
||||||
|
"\t[--dec]\n"
|
||||||
|
"\t[--dump DumpFilePrefix]\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interpret command line arguments -------------------------------------*/
|
||||||
|
|
||||||
|
/* Input file */
|
||||||
|
|
||||||
|
if ((fin = fopen(argv[1],"rb")) == NULL) {
|
||||||
|
fprintf(stderr, "Error opening input bit file: %s: %s.\n",
|
||||||
|
argv[1], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output file */
|
||||||
|
|
||||||
|
if ((arg = switch_present("-o",argc,argv))) {
|
||||||
|
if ((fout = fopen(argv[arg+1],"wb")) == NULL) {
|
||||||
|
fprintf(stderr, "Error opening output speech file: %s: %s.\n",
|
||||||
|
argv[arg+1], strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(out_file,argv[arg+1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fout = NULL;
|
||||||
|
|
||||||
|
lpc_model = 0;
|
||||||
|
if ((arg = switch_present("--lpc",argc,argv))) {
|
||||||
|
lpc_model = 1;
|
||||||
|
order = atoi(argv[arg+1]);
|
||||||
|
if ((order < 4) || (order > 20)) {
|
||||||
|
fprintf(stderr, "Error in lpc order: %d\n", order);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dump = switch_present("--dump",argc,argv);
|
||||||
|
if (dump)
|
||||||
|
dump_on(argv[dump+1]);
|
||||||
|
|
||||||
|
lsp = switch_present("--lsp",argc,argv);
|
||||||
|
lsp_quantiser = 0;
|
||||||
|
|
||||||
|
phase0 = switch_present("--phase0",argc,argv);
|
||||||
|
if (phase0) {
|
||||||
|
ex_phase[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hand_voicing = switch_present("--hand_voicing",argc,argv);
|
||||||
|
if (hand_voicing) {
|
||||||
|
fvoicing = fopen(argv[hand_voicing+1],"rt");
|
||||||
|
assert(fvoicing != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bg_est = 0.0;
|
||||||
|
postfilt = switch_present("--postfilter",argc,argv);
|
||||||
|
|
||||||
|
decimate = switch_present("--dec",argc,argv);
|
||||||
|
|
||||||
|
/* Initialise ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
make_analysis_window(w,W);
|
||||||
|
make_synthesis_window(Pn);
|
||||||
|
quantise_init();
|
||||||
|
|
||||||
|
/* Main loop ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
frames = 0;
|
||||||
|
sum_snr = 0;
|
||||||
|
while(fread(buf,sizeof(short),N,fin)) {
|
||||||
|
frames++;
|
||||||
|
|
||||||
|
/* Read input speech */
|
||||||
|
|
||||||
|
for(i=0; i<M-N; i++)
|
||||||
|
Sn[i] = Sn[i+N];
|
||||||
|
for(i=0; i<N; i++)
|
||||||
|
Sn[i+M-N] = buf[i];
|
||||||
|
|
||||||
|
/* Estimate pitch */
|
||||||
|
|
||||||
|
nlp(nlp_states,Sn,N,M,P_MIN,P_MAX,&pitch,Sw,&prev_Wo);
|
||||||
|
prev_Wo = TWO_PI/pitch;
|
||||||
|
model.Wo = TWO_PI/pitch;
|
||||||
|
|
||||||
|
/* estimate model parameters */
|
||||||
|
|
||||||
|
dft_speech(Sw, Sn, w);
|
||||||
|
two_stage_pitch_refinement(&model, Sw);
|
||||||
|
estimate_amplitudes(&model, Sw, W);
|
||||||
|
dump_Sn(Sn); dump_Sw(Sw); dump_model(&model);
|
||||||
|
|
||||||
|
/* optional zero-phase modelling */
|
||||||
|
|
||||||
|
if (phase0) {
|
||||||
|
float Wn[M]; /* windowed speech samples */
|
||||||
|
float Rk[LPC_ORD+1]; /* autocorrelation coeffs */
|
||||||
|
|
||||||
|
dump_phase(&model.phi[0], model.L);
|
||||||
|
|
||||||
|
/* find aks here, these are overwritten if LPC modelling is enabled */
|
||||||
|
|
||||||
|
for(i=0; i<M; i++)
|
||||||
|
Wn[i] = Sn[i]*w[i];
|
||||||
|
autocorrelate(Wn,Rk,M,LPC_ORD);
|
||||||
|
levinson_durbin(Rk,ak,LPC_ORD);
|
||||||
|
|
||||||
|
if (lpc_model)
|
||||||
|
assert(order == LPC_ORD);
|
||||||
|
|
||||||
|
dump_ak(ak, LPC_ORD);
|
||||||
|
|
||||||
|
/* determine voicing */
|
||||||
|
|
||||||
|
snr = est_voicing_mbe(&model, Sw, W, (FS/TWO_PI)*model.Wo, Sw_);
|
||||||
|
dump_Sw_(Sw_);
|
||||||
|
dump_snr(snr);
|
||||||
|
|
||||||
|
/* just to make sure we are not cheating - kill all phases */
|
||||||
|
|
||||||
|
for(i=0; i<MAX_AMP; i++)
|
||||||
|
model.phi[i] = 0;
|
||||||
|
|
||||||
|
if (hand_voicing) {
|
||||||
|
fscanf(fvoicing,"%d\n",&model.voiced);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* optional LPC model amplitudes */
|
||||||
|
|
||||||
|
if (lpc_model) {
|
||||||
|
int lpc_correction;
|
||||||
|
float e;
|
||||||
|
float lsps[LPC_ORD];
|
||||||
|
int lsp_indexes[LPC_ORD];
|
||||||
|
|
||||||
|
e = speech_to_uq_lsps(lsps, ak, Sn, w, order);
|
||||||
|
lpc_correction = need_lpc_correction(&model, ak, e);
|
||||||
|
|
||||||
|
if (lsp) {
|
||||||
|
encode_lsps(lsp_indexes, lsps, LPC_ORD);
|
||||||
|
/*
|
||||||
|
for(i=0; i<LPC_ORD; i++)
|
||||||
|
printf("lsps[%d] = %f lsp_indexes[%d] = %d\n",
|
||||||
|
i, lsps[i], i, lsp_indexes[i]);
|
||||||
|
printf("\n");
|
||||||
|
*/
|
||||||
|
decode_lsps(lsps, lsp_indexes, LPC_ORD);
|
||||||
|
bw_expand_lsps(lsps, LPC_ORD);
|
||||||
|
lsp_to_lpc(lsps, ak, LPC_ORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
e = decode_energy(encode_energy(e));
|
||||||
|
model.Wo = decode_Wo(encode_Wo(model.Wo));
|
||||||
|
|
||||||
|
aks_to_M2(ak, order, &model, e, &snr, 1);
|
||||||
|
apply_lpc_correction(&model, lpc_correction);
|
||||||
|
sum_snr += snr;
|
||||||
|
dump_quantised_model(&model);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* option decimation to 20ms rate, which enables interpolation
|
||||||
|
routine to synthesise in between frame */
|
||||||
|
|
||||||
|
if (decimate) {
|
||||||
|
if (!phase0) {
|
||||||
|
printf("needs --phase0 to resample phase for interpolated Wo\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* odd frame - interpolate */
|
||||||
|
|
||||||
|
if (frames%2) {
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
model.voiced = 1;
|
||||||
|
prev_model.voiced = 1;
|
||||||
|
if (fabs(prev_model.Wo - model.Wo) < 0.1*model.Wo) {
|
||||||
|
interp_model.voiced = 1;
|
||||||
|
interpolate(&interp_model, &prev_model, &model);
|
||||||
|
for(i=0; i<=interp_model.L; i++) {
|
||||||
|
interp_model.phi[i] = phi1[i];
|
||||||
|
}
|
||||||
|
printf("interp\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
interp_model = tmp_model;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
interp_model.voiced = voiced1;
|
||||||
|
interpolate(&interp_model, &prev_model, &model);
|
||||||
|
|
||||||
|
if (phase0)
|
||||||
|
phase_synth_zero_order(&interp_model, ak, ex_phase);
|
||||||
|
if (postfilt)
|
||||||
|
postfilter(&interp_model, &bg_est);
|
||||||
|
synth_one_frame(buf, &interp_model, Sn_, Pn);
|
||||||
|
if (fout != NULL) fwrite(buf,sizeof(short),N,fout);
|
||||||
|
|
||||||
|
if (phase0)
|
||||||
|
phase_synth_zero_order(&model, ak, ex_phase);
|
||||||
|
if (postfilt)
|
||||||
|
postfilter(&model, &bg_est);
|
||||||
|
synth_one_frame(buf, &model, Sn_, Pn);
|
||||||
|
if (fout != NULL) fwrite(buf,sizeof(short),N,fout);
|
||||||
|
|
||||||
|
prev_model = model;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
voiced1 = model.voiced;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (phase0)
|
||||||
|
phase_synth_zero_order(&model, ak, ex_phase);
|
||||||
|
if (postfilt)
|
||||||
|
postfilter(&model, &bg_est);
|
||||||
|
synth_one_frame(buf, &model, Sn_, Pn);
|
||||||
|
if (fout != NULL) fwrite(buf,sizeof(short),N,fout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fout != NULL)
|
||||||
|
fclose(fout);
|
||||||
|
|
||||||
|
if (lpc_model)
|
||||||
|
printf("SNR av = %5.2f dB\n", sum_snr/frames);
|
||||||
|
|
||||||
|
if (dump)
|
||||||
|
dump_off();
|
||||||
|
|
||||||
|
if (hand_voicing)
|
||||||
|
fclose(fvoicing);
|
||||||
|
|
||||||
|
nlp_destroy(nlp_states);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void synth_one_frame(short buf[], MODEL *model, float Sn_[], float Pn[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
synthesise(Sn_, model, Pn, 1);
|
||||||
|
|
||||||
|
for(i=0; i<N; i++) {
|
||||||
|
if (Sn_[i] > 32767.0)
|
||||||
|
buf[i] = 32767;
|
||||||
|
else if (Sn_[i] < -32767.0)
|
||||||
|
buf[i] = -32767;
|
||||||
|
else
|
||||||
|
buf[i] = Sn_[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
9
libs/libcodec2/src/codeall.sh
Executable file
9
libs/libcodec2/src/codeall.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# codeall.sh
|
||||||
|
# David Rowe 24 sep 2009
|
||||||
|
# Code all samples using various processing steps
|
||||||
|
./code.sh hts1a
|
||||||
|
./code.sh hts2a
|
||||||
|
./code.sh mmt1
|
||||||
|
./code.sh morig
|
||||||
|
./code.sh forig
|
162
libs/libcodec2/src/codebook.c
Normal file
162
libs/libcodec2/src/codebook.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
float codebook_lsp1[] = {
|
||||||
|
225,
|
||||||
|
250,
|
||||||
|
275,
|
||||||
|
300,
|
||||||
|
325,
|
||||||
|
350,
|
||||||
|
375,
|
||||||
|
400,
|
||||||
|
425,
|
||||||
|
450,
|
||||||
|
475,
|
||||||
|
500,
|
||||||
|
525,
|
||||||
|
550,
|
||||||
|
575,
|
||||||
|
600,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp2[] = {
|
||||||
|
325,
|
||||||
|
350,
|
||||||
|
375,
|
||||||
|
400,
|
||||||
|
425,
|
||||||
|
450,
|
||||||
|
475,
|
||||||
|
500,
|
||||||
|
525,
|
||||||
|
550,
|
||||||
|
575,
|
||||||
|
600,
|
||||||
|
625,
|
||||||
|
650,
|
||||||
|
675,
|
||||||
|
700,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp3[] = {
|
||||||
|
500,
|
||||||
|
550,
|
||||||
|
600,
|
||||||
|
650,
|
||||||
|
700,
|
||||||
|
750,
|
||||||
|
800,
|
||||||
|
850,
|
||||||
|
900,
|
||||||
|
950,
|
||||||
|
1000,
|
||||||
|
1050,
|
||||||
|
1100,
|
||||||
|
1150,
|
||||||
|
1200,
|
||||||
|
1250,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp4[] = {
|
||||||
|
700,
|
||||||
|
800,
|
||||||
|
900,
|
||||||
|
1000,
|
||||||
|
1100,
|
||||||
|
1200,
|
||||||
|
1300,
|
||||||
|
1400,
|
||||||
|
1500,
|
||||||
|
1600,
|
||||||
|
1700,
|
||||||
|
1800,
|
||||||
|
1900,
|
||||||
|
2000,
|
||||||
|
2100,
|
||||||
|
2200,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp5[] = {
|
||||||
|
950,
|
||||||
|
1050,
|
||||||
|
1150,
|
||||||
|
1250,
|
||||||
|
1350,
|
||||||
|
1450,
|
||||||
|
1550,
|
||||||
|
1650,
|
||||||
|
1750,
|
||||||
|
1850,
|
||||||
|
1950,
|
||||||
|
2050,
|
||||||
|
2150,
|
||||||
|
2250,
|
||||||
|
2350,
|
||||||
|
2450,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp6[] = {
|
||||||
|
1100,
|
||||||
|
1200,
|
||||||
|
1300,
|
||||||
|
1400,
|
||||||
|
1500,
|
||||||
|
1600,
|
||||||
|
1700,
|
||||||
|
1800,
|
||||||
|
1900,
|
||||||
|
2000,
|
||||||
|
2100,
|
||||||
|
2200,
|
||||||
|
2300,
|
||||||
|
2400,
|
||||||
|
2500,
|
||||||
|
2600,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp7[] = {
|
||||||
|
1500,
|
||||||
|
1600,
|
||||||
|
1700,
|
||||||
|
1800,
|
||||||
|
1900,
|
||||||
|
2000,
|
||||||
|
2100,
|
||||||
|
2200,
|
||||||
|
2300,
|
||||||
|
2400,
|
||||||
|
2500,
|
||||||
|
2600,
|
||||||
|
2700,
|
||||||
|
2800,
|
||||||
|
2900,
|
||||||
|
3000,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp8[] = {
|
||||||
|
2300,
|
||||||
|
2400,
|
||||||
|
2500,
|
||||||
|
2600,
|
||||||
|
2700,
|
||||||
|
2800,
|
||||||
|
2900,
|
||||||
|
3000,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp9[] = {
|
||||||
|
2500,
|
||||||
|
2600,
|
||||||
|
2700,
|
||||||
|
2800,
|
||||||
|
2900,
|
||||||
|
3000,
|
||||||
|
3100,
|
||||||
|
3200,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
float codebook_lsp10[] = {
|
||||||
|
2900,
|
||||||
|
3100,
|
||||||
|
3300,
|
||||||
|
3500,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
|
15
libs/libcodec2/src/codebook.h
Normal file
15
libs/libcodec2/src/codebook.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef CODEBOOK_H
|
||||||
|
#define CODEBOOK_H
|
||||||
|
|
||||||
|
extern float codebook_lsp1[];
|
||||||
|
extern float codebook_lsp2[];
|
||||||
|
extern float codebook_lsp3[];
|
||||||
|
extern float codebook_lsp4[];
|
||||||
|
extern float codebook_lsp5[];
|
||||||
|
extern float codebook_lsp6[];
|
||||||
|
extern float codebook_lsp7[];
|
||||||
|
extern float codebook_lsp8[];
|
||||||
|
extern float codebook_lsp9[];
|
||||||
|
extern float codebook_lsp10[];
|
||||||
|
|
||||||
|
#endif
|
337
libs/libcodec2/src/codec2.c
Normal file
337
libs/libcodec2/src/codec2.c
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: codec2.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Codec2 fully quantised encoder and decoder functions. If you want use
|
||||||
|
codec2, the codec2_xxx functions are for you.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "sine.h"
|
||||||
|
#include "nlp.h"
|
||||||
|
#include "dump.h"
|
||||||
|
#include "lpc.h"
|
||||||
|
#include "quantise.h"
|
||||||
|
#include "phase.h"
|
||||||
|
#include "interp.h"
|
||||||
|
#include "postfilter.h"
|
||||||
|
#include "codec2.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float Sn[M]; /* input speech */
|
||||||
|
float w[M]; /* time domain hamming window */
|
||||||
|
COMP W[FFT_ENC]; /* DFT of w[] */
|
||||||
|
float Pn[2*N]; /* trapezoidal synthesis window */
|
||||||
|
float Sn_[2*N]; /* synthesised speech */
|
||||||
|
float prev_Wo; /* previous frame's pitch estimate */
|
||||||
|
float ex_phase; /* excitation model phase track */
|
||||||
|
float bg_est; /* background noise estimate for post filter */
|
||||||
|
MODEL prev_model; /* model parameters from 20ms ago */
|
||||||
|
void *nlp; /* pitch predictor states */
|
||||||
|
} CODEC2;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION HEADERS
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void analyse_one_frame(CODEC2 *c2, MODEL *model, short speech[]);
|
||||||
|
void synthesise_one_frame(CODEC2 *c2, short speech[], MODEL *model,float ak[]);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTIONS
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: codec2_create
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Create and initialise an instance of the codec. Returns a pointer
|
||||||
|
to the codec states or NULL on failure. One set of states is
|
||||||
|
sufficient for a full duuplex codec (i.e. an encoder and decoder).
|
||||||
|
You don't need separate states for encoders and decoders. See
|
||||||
|
c2enc.c and c2dec.c for examples.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void *codec2_create()
|
||||||
|
{
|
||||||
|
CODEC2 *c2;
|
||||||
|
int i,l;
|
||||||
|
|
||||||
|
c2 = (CODEC2*)malloc(sizeof(CODEC2));
|
||||||
|
if (c2 == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for(i=0; i<M; i++)
|
||||||
|
c2->Sn[i] = 1.0;
|
||||||
|
for(i=0; i<2*N; i++)
|
||||||
|
c2->Sn_[i] = 0;
|
||||||
|
make_analysis_window(c2->w,c2->W);
|
||||||
|
make_synthesis_window(c2->Pn);
|
||||||
|
quantise_init();
|
||||||
|
c2->prev_Wo = 0.0;
|
||||||
|
c2->bg_est = 0.0;
|
||||||
|
c2->ex_phase = 0.0;
|
||||||
|
|
||||||
|
for(l=1; l<=MAX_AMP; l++)
|
||||||
|
c2->prev_model.A[l] = 0.0;
|
||||||
|
c2->prev_model.Wo = TWO_PI/P_MAX;
|
||||||
|
|
||||||
|
c2->nlp = nlp_create();
|
||||||
|
if (c2->nlp == NULL) {
|
||||||
|
free (c2);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void*)c2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: codec2_create
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Destroy an instance of the codec.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void codec2_destroy(void *codec2_state)
|
||||||
|
{
|
||||||
|
CODEC2 *c2;
|
||||||
|
|
||||||
|
assert(codec2_state != NULL);
|
||||||
|
c2 = (CODEC2*)codec2_state;
|
||||||
|
nlp_destroy(c2->nlp);
|
||||||
|
free(codec2_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: codec2_encode
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Encodes 160 speech samples (20ms of speech) into 51 bits.
|
||||||
|
|
||||||
|
The codec2 algorithm actually operates internally on 10ms (80
|
||||||
|
sample) frames, so we run the encoding algorithm twice. On the
|
||||||
|
first frame we just send the voicing bit. One the second frame we
|
||||||
|
send all model parameters.
|
||||||
|
|
||||||
|
The bit allocation is:
|
||||||
|
|
||||||
|
Parameter bits/frame
|
||||||
|
--------------------------------------
|
||||||
|
Harmonic magnitudes (LSPs) 36
|
||||||
|
Low frequency LPC correction 1
|
||||||
|
Energy 5
|
||||||
|
Wo (fundamental frequnecy) 7
|
||||||
|
Voicing (10ms update) 2
|
||||||
|
TOTAL 51
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void codec2_encode(void *codec2_state, unsigned char * bits, short speech[])
|
||||||
|
{
|
||||||
|
CODEC2 *c2;
|
||||||
|
MODEL model;
|
||||||
|
int voiced1, voiced2;
|
||||||
|
int lsp_indexes[LPC_ORD];
|
||||||
|
int lpc_correction;
|
||||||
|
int energy_index;
|
||||||
|
int Wo_index;
|
||||||
|
int i;
|
||||||
|
unsigned int nbit = 0;
|
||||||
|
|
||||||
|
assert(codec2_state != NULL);
|
||||||
|
c2 = (CODEC2*)codec2_state;
|
||||||
|
|
||||||
|
/* first 10ms analysis frame - we just want voicing */
|
||||||
|
|
||||||
|
analyse_one_frame(c2, &model, speech);
|
||||||
|
voiced1 = model.voiced;
|
||||||
|
|
||||||
|
/* second 10ms analysis frame */
|
||||||
|
|
||||||
|
analyse_one_frame(c2, &model, &speech[N]);
|
||||||
|
voiced2 = model.voiced;
|
||||||
|
|
||||||
|
Wo_index = encode_Wo(model.Wo);
|
||||||
|
encode_amplitudes(lsp_indexes,
|
||||||
|
&lpc_correction,
|
||||||
|
&energy_index,
|
||||||
|
&model,
|
||||||
|
c2->Sn,
|
||||||
|
c2->w);
|
||||||
|
memset(bits, '\0', ((CODEC2_BITS_PER_FRAME + 7) / 8));
|
||||||
|
pack(bits, &nbit, Wo_index, WO_BITS);
|
||||||
|
for(i=0; i<LPC_ORD; i++) {
|
||||||
|
pack(bits, &nbit, lsp_indexes[i], lsp_bits(i));
|
||||||
|
}
|
||||||
|
pack(bits, &nbit, lpc_correction, 1);
|
||||||
|
pack(bits, &nbit, energy_index, E_BITS);
|
||||||
|
pack(bits, &nbit, voiced1, 1);
|
||||||
|
pack(bits, &nbit, voiced2, 1);
|
||||||
|
|
||||||
|
assert(nbit == CODEC2_BITS_PER_FRAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: codec2_decode
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Decodes frames of 51 bits into 160 samples (20ms) of speech.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void codec2_decode(void *codec2_state, short speech[],
|
||||||
|
const unsigned char * bits)
|
||||||
|
{
|
||||||
|
CODEC2 *c2;
|
||||||
|
MODEL model;
|
||||||
|
int voiced1, voiced2;
|
||||||
|
int lsp_indexes[LPC_ORD];
|
||||||
|
int lpc_correction;
|
||||||
|
int energy_index;
|
||||||
|
int Wo_index;
|
||||||
|
float ak[LPC_ORD+1];
|
||||||
|
int i;
|
||||||
|
unsigned int nbit = 0;
|
||||||
|
MODEL model_interp;
|
||||||
|
|
||||||
|
assert(codec2_state != NULL);
|
||||||
|
c2 = (CODEC2*)codec2_state;
|
||||||
|
|
||||||
|
Wo_index = unpack(bits, &nbit, WO_BITS);
|
||||||
|
for(i=0; i<LPC_ORD; i++) {
|
||||||
|
lsp_indexes[i] = unpack(bits, &nbit, lsp_bits(i));
|
||||||
|
}
|
||||||
|
lpc_correction = unpack(bits, &nbit, 1);
|
||||||
|
energy_index = unpack(bits, &nbit, E_BITS);
|
||||||
|
voiced1 = unpack(bits, &nbit, 1);
|
||||||
|
voiced2 = unpack(bits, &nbit, 1);
|
||||||
|
assert(nbit == CODEC2_BITS_PER_FRAME);
|
||||||
|
|
||||||
|
model.Wo = decode_Wo(Wo_index);
|
||||||
|
model.L = PI/model.Wo;
|
||||||
|
decode_amplitudes(&model,
|
||||||
|
ak,
|
||||||
|
lsp_indexes,
|
||||||
|
lpc_correction,
|
||||||
|
energy_index);
|
||||||
|
|
||||||
|
model.voiced = voiced2;
|
||||||
|
model_interp.voiced = voiced1;
|
||||||
|
interpolate(&model_interp, &c2->prev_model, &model);
|
||||||
|
|
||||||
|
synthesise_one_frame(c2, speech, &model_interp, ak);
|
||||||
|
synthesise_one_frame(c2, &speech[N], &model, ak);
|
||||||
|
|
||||||
|
memcpy(&c2->prev_model, &model, sizeof(MODEL));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: synthesise_one_frame()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/8/2010
|
||||||
|
|
||||||
|
Synthesise 80 speech samples (10ms) from model parameters.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void synthesise_one_frame(CODEC2 *c2, short speech[], MODEL *model, float ak[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
phase_synth_zero_order(model, ak, &c2->ex_phase);
|
||||||
|
postfilter(model, &c2->bg_est);
|
||||||
|
synthesise(c2->Sn_, model, c2->Pn, 1);
|
||||||
|
|
||||||
|
for(i=0; i<N; i++) {
|
||||||
|
if (c2->Sn_[i] > 32767.0)
|
||||||
|
speech[i] = 32767;
|
||||||
|
else if (c2->Sn_[i] < -32767.0)
|
||||||
|
speech[i] = -32767;
|
||||||
|
else
|
||||||
|
speech[i] = c2->Sn_[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: analyse_one_frame()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/8/2010
|
||||||
|
|
||||||
|
Extract sinusoidal model parameters from 80 speech samples (10ms of
|
||||||
|
speech).
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void analyse_one_frame(CODEC2 *c2, MODEL *model, short speech[])
|
||||||
|
{
|
||||||
|
COMP Sw[FFT_ENC];
|
||||||
|
COMP Sw_[FFT_ENC];
|
||||||
|
float pitch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Read input speech */
|
||||||
|
|
||||||
|
for(i=0; i<M-N; i++)
|
||||||
|
c2->Sn[i] = c2->Sn[i+N];
|
||||||
|
for(i=0; i<N; i++)
|
||||||
|
c2->Sn[i+M-N] = speech[i];
|
||||||
|
dft_speech(Sw, c2->Sn, c2->w);
|
||||||
|
|
||||||
|
/* Estimate pitch */
|
||||||
|
|
||||||
|
nlp(c2->nlp,c2->Sn,N,M,P_MIN,P_MAX,&pitch,Sw,&c2->prev_Wo);
|
||||||
|
c2->prev_Wo = TWO_PI/pitch;
|
||||||
|
model->Wo = TWO_PI/pitch;
|
||||||
|
model->L = PI/model->Wo;
|
||||||
|
|
||||||
|
/* estimate model parameters */
|
||||||
|
|
||||||
|
dft_speech(Sw, c2->Sn, c2->w);
|
||||||
|
two_stage_pitch_refinement(model, Sw);
|
||||||
|
estimate_amplitudes(model, Sw, c2->W);
|
||||||
|
est_voicing_mbe(model, Sw, c2->W, (FS/TWO_PI)*model->Wo, Sw_);
|
||||||
|
}
|
43
libs/libcodec2/src/codec2.h
Normal file
43
libs/libcodec2/src/codec2.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: codec2.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 21/8/2010
|
||||||
|
|
||||||
|
Codec2 fully quantised encoder and decoder functions. If you want use
|
||||||
|
codec2, these are the functions you need to call.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CODEC2__
|
||||||
|
#define __CODEC2__
|
||||||
|
#include "codebook.h"
|
||||||
|
|
||||||
|
#define CODEC2_SAMPLES_PER_FRAME 160
|
||||||
|
#define CODEC2_BITS_PER_FRAME 51
|
||||||
|
|
||||||
|
void *codec2_create();
|
||||||
|
void codec2_destroy(void *codec2_state);
|
||||||
|
void codec2_encode(void *codec2_state, unsigned char * bits, short speech_in[]);
|
||||||
|
void codec2_decode(void *codec2_state, short speech_out[],
|
||||||
|
const unsigned char * bits);
|
||||||
|
|
||||||
|
#endif
|
39
libs/libcodec2/src/comp.h
Normal file
39
libs/libcodec2/src/comp.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: comp.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/08/09
|
||||||
|
|
||||||
|
Complex number definition.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COMP__
|
||||||
|
#define __COMP__
|
||||||
|
|
||||||
|
/* Complex number */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float real;
|
||||||
|
float imag;
|
||||||
|
} COMP;
|
||||||
|
|
||||||
|
#endif
|
84
libs/libcodec2/src/defines.h
Normal file
84
libs/libcodec2/src/defines.h
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: defines.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/4/93
|
||||||
|
|
||||||
|
Defines and structures used throughout the codec.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DEFINES__
|
||||||
|
#define __DEFINES__
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
DEFINES
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* General defines */
|
||||||
|
|
||||||
|
#define N 80 /* number of samples per frame */
|
||||||
|
#define MAX_AMP 80 /* maximum number of harmonics */
|
||||||
|
#define PI 3.141592654 /* mathematical constant */
|
||||||
|
#define TWO_PI 6.283185307 /* mathematical constant */
|
||||||
|
#define FS 8000 /* sample rate in Hz */
|
||||||
|
#define MAX_STR 256 /* maximum string size */
|
||||||
|
|
||||||
|
#define NW 279 /* analysis window size */
|
||||||
|
#define FFT_ENC 512 /* size of FFT used for encoder */
|
||||||
|
#define FFT_DEC 512 /* size of FFT used in decoder */
|
||||||
|
#define TW 40 /* Trapezoidal synthesis window overlap */
|
||||||
|
#define V_THRESH 4.0 /* voicing threshold in dB */
|
||||||
|
#define LPC_MAX 20 /* maximum LPC order */
|
||||||
|
#define LPC_ORD 10 /* phase modelling LPC order */
|
||||||
|
|
||||||
|
/* Pitch estimation defines */
|
||||||
|
|
||||||
|
#define M 320 /* pitch analysis frame size */
|
||||||
|
#define P_MIN 20 /* minimum pitch */
|
||||||
|
#define P_MAX 160 /* maximum pitch */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
TYPEDEFS
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Complex number */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float real;
|
||||||
|
float imag;
|
||||||
|
} COMP;
|
||||||
|
|
||||||
|
/* Structure to hold model parameters for one frame */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float Wo; /* fundamental frequency estimate in radians */
|
||||||
|
int L; /* number of harmonics */
|
||||||
|
float A[MAX_AMP]; /* amplitiude of each harmonic */
|
||||||
|
float phi[MAX_AMP]; /* phase of each harmonic */
|
||||||
|
int voiced; /* non-zero if this frame is voiced */
|
||||||
|
} MODEL;
|
||||||
|
|
||||||
|
#endif
|
402
libs/libcodec2/src/dump.c
Normal file
402
libs/libcodec2/src/dump.c
Normal file
@ -0,0 +1,402 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: dump.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 25/8/09
|
||||||
|
|
||||||
|
Routines to dump data to text files for Octave analysis.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "dump.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
static int dumpon = 0;
|
||||||
|
|
||||||
|
static FILE *fsn = NULL;
|
||||||
|
static FILE *fsw = NULL;
|
||||||
|
static FILE *fsw_ = NULL;
|
||||||
|
static FILE *fmodel = NULL;
|
||||||
|
static FILE *fqmodel = NULL;
|
||||||
|
static FILE *fpw = NULL;
|
||||||
|
static FILE *flsp = NULL;
|
||||||
|
static FILE *fphase = NULL;
|
||||||
|
static FILE *fphase_ = NULL;
|
||||||
|
static FILE *ffw = NULL;
|
||||||
|
static FILE *fe = NULL;
|
||||||
|
static FILE *fsq = NULL;
|
||||||
|
static FILE *fdec = NULL;
|
||||||
|
static FILE *fsnr = NULL;
|
||||||
|
static FILE *fak = NULL;
|
||||||
|
static FILE *fbg = NULL;
|
||||||
|
static FILE *fE = NULL;
|
||||||
|
|
||||||
|
static char prefix[MAX_STR];
|
||||||
|
|
||||||
|
void dump_on(char p[]) {
|
||||||
|
dumpon = 1;
|
||||||
|
strcpy(prefix, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_off(){
|
||||||
|
if (fsn != NULL)
|
||||||
|
fclose(fsn);
|
||||||
|
if (fsw != NULL)
|
||||||
|
fclose(fsw);
|
||||||
|
if (fsw_ != NULL)
|
||||||
|
fclose(fsw_);
|
||||||
|
if (fmodel != NULL)
|
||||||
|
fclose(fmodel);
|
||||||
|
if (fqmodel != NULL)
|
||||||
|
fclose(fqmodel);
|
||||||
|
if (fpw != NULL)
|
||||||
|
fclose(fpw);
|
||||||
|
if (flsp != NULL)
|
||||||
|
fclose(flsp);
|
||||||
|
if (fphase != NULL)
|
||||||
|
fclose(fphase);
|
||||||
|
if (fphase_ != NULL)
|
||||||
|
fclose(fphase_);
|
||||||
|
if (ffw != NULL)
|
||||||
|
fclose(ffw);
|
||||||
|
if (fe != NULL)
|
||||||
|
fclose(fe);
|
||||||
|
if (fsq != NULL)
|
||||||
|
fclose(fsq);
|
||||||
|
if (fdec != NULL)
|
||||||
|
fclose(fdec);
|
||||||
|
if (fsnr != NULL)
|
||||||
|
fclose(fsnr);
|
||||||
|
if (fak != NULL)
|
||||||
|
fclose(fak);
|
||||||
|
if (fbg != NULL)
|
||||||
|
fclose(fbg);
|
||||||
|
if (fE != NULL)
|
||||||
|
fclose(fE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_Sn(float Sn[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fsn == NULL) {
|
||||||
|
sprintf(s,"%s_sn.txt", prefix);
|
||||||
|
fsn = fopen(s, "wt");
|
||||||
|
assert(fsn != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* split across two lines to avoid max line length problems */
|
||||||
|
/* reconstruct in Octave */
|
||||||
|
|
||||||
|
for(i=0; i<M/2; i++)
|
||||||
|
fprintf(fsn,"%f\t",Sn[i]);
|
||||||
|
fprintf(fsn,"\n");
|
||||||
|
for(i=M/2; i<M; i++)
|
||||||
|
fprintf(fsn,"%f\t",Sn[i]);
|
||||||
|
fprintf(fsn,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_Sw(COMP Sw[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fsw == NULL) {
|
||||||
|
sprintf(s,"%s_sw.txt", prefix);
|
||||||
|
fsw = fopen(s, "wt");
|
||||||
|
assert(fsw != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<FFT_ENC/2; i++)
|
||||||
|
fprintf(fsw,"%f\t",
|
||||||
|
10.0*log10(Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag));
|
||||||
|
fprintf(fsw,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_Sw_(COMP Sw_[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fsw_ == NULL) {
|
||||||
|
sprintf(s,"%s_sw_.txt", prefix);
|
||||||
|
fsw_ = fopen(s, "wt");
|
||||||
|
assert(fsw_ != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<FFT_ENC/2; i++)
|
||||||
|
fprintf(fsw_,"%f\t",
|
||||||
|
10.0*log10(Sw_[i].real*Sw_[i].real + Sw_[i].imag*Sw_[i].imag));
|
||||||
|
fprintf(fsw_,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_model(MODEL *model) {
|
||||||
|
int l;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fmodel == NULL) {
|
||||||
|
sprintf(s,"%s_model.txt", prefix);
|
||||||
|
fmodel = fopen(s, "wt");
|
||||||
|
assert(fmodel != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fmodel,"%f\t%d\t", model->Wo, model->L);
|
||||||
|
for(l=1; l<=model->L; l++)
|
||||||
|
fprintf(fmodel,"%f\t",model->A[l]);
|
||||||
|
for(l=model->L+1; l<MAX_AMP; l++)
|
||||||
|
fprintf(fmodel,"0.0\t");
|
||||||
|
fprintf(fmodel,"%d\t",model->voiced);
|
||||||
|
fprintf(fmodel,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_quantised_model(MODEL *model) {
|
||||||
|
int l;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fqmodel == NULL) {
|
||||||
|
sprintf(s,"%s_qmodel.txt", prefix);
|
||||||
|
fqmodel = fopen(s, "wt");
|
||||||
|
assert(fqmodel != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fqmodel,"%f\t%d\t", model->Wo, model->L);
|
||||||
|
for(l=1; l<=model->L; l++)
|
||||||
|
fprintf(fqmodel,"%f\t",model->A[l]);
|
||||||
|
for(l=model->L+1; l<MAX_AMP; l++)
|
||||||
|
fprintf(fqmodel,"0.0\t");
|
||||||
|
fprintf(fqmodel,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_phase(float phase[], int L) {
|
||||||
|
int l;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fphase == NULL) {
|
||||||
|
sprintf(s,"%s_phase.txt", prefix);
|
||||||
|
fphase = fopen(s, "wt");
|
||||||
|
assert(fphase != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(l=1; l<=L; l++)
|
||||||
|
fprintf(fphase,"%f\t",phase[l]);
|
||||||
|
for(l=L+1; l<MAX_AMP; l++)
|
||||||
|
fprintf(fphase,"%f\t",0.0);
|
||||||
|
fprintf(fphase,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_phase_(float phase_[], int L) {
|
||||||
|
int l;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fphase_ == NULL) {
|
||||||
|
sprintf(s,"%s_phase_.txt", prefix);
|
||||||
|
fphase_ = fopen(s, "wt");
|
||||||
|
assert(fphase_ != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(l=1; l<=L; l++)
|
||||||
|
fprintf(fphase_,"%f\t",phase_[l]);
|
||||||
|
for(l=L+1; l<MAX_AMP; l++)
|
||||||
|
fprintf(fphase_,"%f\t",0.0);
|
||||||
|
fprintf(fphase_,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_snr(float snr) {
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fsnr == NULL) {
|
||||||
|
sprintf(s,"%s_snr.txt", prefix);
|
||||||
|
fsnr = fopen(s, "wt");
|
||||||
|
assert(fsnr != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fsnr,"%f\n",snr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_Pw(COMP Pw[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fpw == NULL) {
|
||||||
|
sprintf(s,"%s_pw.txt", prefix);
|
||||||
|
fpw = fopen(s, "wt");
|
||||||
|
assert(fpw != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<FFT_DEC/2; i++)
|
||||||
|
fprintf(fpw,"%f\t",Pw[i].real);
|
||||||
|
fprintf(fpw,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_lsp(float lsp[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (flsp == NULL) {
|
||||||
|
sprintf(s,"%s_lsp.txt", prefix);
|
||||||
|
flsp = fopen(s, "wt");
|
||||||
|
assert(flsp != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<10; i++)
|
||||||
|
fprintf(flsp,"%f\t",lsp[i]);
|
||||||
|
fprintf(flsp,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_ak(float ak[], int order) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fak == NULL) {
|
||||||
|
sprintf(s,"%s_ak.txt", prefix);
|
||||||
|
fak = fopen(s, "wt");
|
||||||
|
assert(fak != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<=order; i++)
|
||||||
|
fprintf(fak,"%f\t",ak[i]);
|
||||||
|
fprintf(fak,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_Fw(COMP Fw[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (ffw == NULL) {
|
||||||
|
sprintf(s,"%s_fw.txt", prefix);
|
||||||
|
ffw = fopen(s, "wt");
|
||||||
|
assert(ffw != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
fprintf(ffw,"%f\t",Fw[i].real);
|
||||||
|
fprintf(ffw,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_e(float e_hz[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fe == NULL) {
|
||||||
|
sprintf(s,"%s_e.txt", prefix);
|
||||||
|
fe = fopen(s, "wt");
|
||||||
|
assert(fe != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<500/2; i++)
|
||||||
|
fprintf(fe,"%f\t",e_hz[i]);
|
||||||
|
fprintf(fe,"\n");
|
||||||
|
for(i=500/2; i<500; i++)
|
||||||
|
fprintf(fe,"%f\t",e_hz[i]);
|
||||||
|
fprintf(fe,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_sq(float sq[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fsq == NULL) {
|
||||||
|
sprintf(s,"%s_sq.txt", prefix);
|
||||||
|
fsq = fopen(s, "wt");
|
||||||
|
assert(fsq != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<M/2; i++)
|
||||||
|
fprintf(fsq,"%f\t",sq[i]);
|
||||||
|
fprintf(fsq,"\n");
|
||||||
|
for(i=M/2; i<M; i++)
|
||||||
|
fprintf(fsq,"%f\t",sq[i]);
|
||||||
|
fprintf(fsq,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_dec(COMP Fw[]) {
|
||||||
|
int i;
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fdec == NULL) {
|
||||||
|
sprintf(s,"%s_dec.txt", prefix);
|
||||||
|
fdec = fopen(s, "wt");
|
||||||
|
assert(fdec != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<320/5; i++)
|
||||||
|
fprintf(fdec,"%f\t",Fw[i].real);
|
||||||
|
fprintf(fdec,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_bg(float e, float bg_est, float percent_uv) {
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fbg == NULL) {
|
||||||
|
sprintf(s,"%s_bg.txt", prefix);
|
||||||
|
fbg = fopen(s, "wt");
|
||||||
|
assert(fbg != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fbg,"%f\t%f\t%f\n", e, bg_est, percent_uv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump_E(float E) {
|
||||||
|
char s[MAX_STR];
|
||||||
|
|
||||||
|
if (!dumpon) return;
|
||||||
|
|
||||||
|
if (fE == NULL) {
|
||||||
|
sprintf(s,"%s_E.txt", prefix);
|
||||||
|
fE = fopen(s, "wt");
|
||||||
|
assert(fE != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fE,"%f\n", 10.0*log10(E));
|
||||||
|
}
|
63
libs/libcodec2/src/dump.h
Normal file
63
libs/libcodec2/src/dump.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: dump.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 25/8/09
|
||||||
|
|
||||||
|
Routines to dump data to text files for Octave analysis.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DUMP__
|
||||||
|
#define __DUMP__
|
||||||
|
|
||||||
|
void dump_on(char filename_prefix[]);
|
||||||
|
void dump_off();
|
||||||
|
|
||||||
|
void dump_Sn(float Sn[]);
|
||||||
|
void dump_Sw(COMP Sw[]);
|
||||||
|
void dump_Sw_(COMP Sw_[]);
|
||||||
|
|
||||||
|
/* amplitude modelling */
|
||||||
|
|
||||||
|
void dump_model(MODEL *m);
|
||||||
|
void dump_quantised_model(MODEL *m);
|
||||||
|
void dump_Pw(COMP Pw[]);
|
||||||
|
void dump_lsp(float lsp[]);
|
||||||
|
void dump_ak(float ak[], int order);
|
||||||
|
void dump_E(float E);
|
||||||
|
|
||||||
|
/* phase modelling */
|
||||||
|
|
||||||
|
void dump_snr(float snr);
|
||||||
|
void dump_phase(float phase[], int L);
|
||||||
|
void dump_phase_(float phase[], int L);
|
||||||
|
|
||||||
|
/* NLP states */
|
||||||
|
|
||||||
|
void dump_sq(float sq[]);
|
||||||
|
void dump_dec(COMP Fw[]);
|
||||||
|
void dump_Fw(COMP Fw[]);
|
||||||
|
void dump_e(float e_hz[]);
|
||||||
|
|
||||||
|
/* post filter */
|
||||||
|
|
||||||
|
void dump_bg(float e, float bg_est, float percent_uv);
|
||||||
|
|
||||||
|
#endif
|
64
libs/libcodec2/src/four1.c
Normal file
64
libs/libcodec2/src/four1.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: four1.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 20/2/95
|
||||||
|
|
||||||
|
Numerical Recipies in C FFT function. I have a nasty licence so please
|
||||||
|
replace me.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
|
||||||
|
|
||||||
|
void four1(data,nn,isign)
|
||||||
|
float data[];
|
||||||
|
int nn,isign;
|
||||||
|
{
|
||||||
|
int n,mmax,m,j,istep,i;
|
||||||
|
double wtemp,wr,wpr,wpi,wi,theta;
|
||||||
|
float tempr,tempi;
|
||||||
|
|
||||||
|
n=nn << 1;
|
||||||
|
j=1;
|
||||||
|
for (i=1;i<n;i+=2) {
|
||||||
|
if (j > i) {
|
||||||
|
SWAP(data[j],data[i]);
|
||||||
|
SWAP(data[j+1],data[i+1]);
|
||||||
|
}
|
||||||
|
m=n >> 1;
|
||||||
|
while (m >= 2 && j > m) {
|
||||||
|
j -= m;
|
||||||
|
m >>= 1;
|
||||||
|
}
|
||||||
|
j += m;
|
||||||
|
}
|
||||||
|
mmax=2;
|
||||||
|
while (n > mmax) {
|
||||||
|
istep=2*mmax;
|
||||||
|
theta=6.28318530717959/(isign*mmax);
|
||||||
|
wtemp=sin(0.5*theta);
|
||||||
|
wpr = -2.0*wtemp*wtemp;
|
||||||
|
wpi=sin(theta);
|
||||||
|
wr=1.0;
|
||||||
|
wi=0.0;
|
||||||
|
for (m=1;m<mmax;m+=2) {
|
||||||
|
for (i=m;i<=n;i+=istep) {
|
||||||
|
j=i+mmax;
|
||||||
|
tempr=wr*data[j]-wi*data[j+1];
|
||||||
|
tempi=wr*data[j+1]+wi*data[j];
|
||||||
|
data[j]=data[i]-tempr;
|
||||||
|
data[j+1]=data[i+1]-tempi;
|
||||||
|
data[i] += tempr;
|
||||||
|
data[i+1] += tempi;
|
||||||
|
}
|
||||||
|
wr=(wtemp=wr)*wpr-wi*wpi+wr;
|
||||||
|
wi=wi*wpr+wtemp*wpi+wi;
|
||||||
|
}
|
||||||
|
mmax=istep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef SWAP
|
18
libs/libcodec2/src/four1.h
Normal file
18
libs/libcodec2/src/four1.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: four1.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 20/2/95
|
||||||
|
|
||||||
|
Numerical Recipies in C FFT function. I have a nasty licence so please
|
||||||
|
replace me.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __FOUR1__
|
||||||
|
#define __FOUR1__
|
||||||
|
|
||||||
|
void four1(float x[], int n, int isign);
|
||||||
|
|
||||||
|
#endif /* __FOUR1__ */
|
||||||
|
|
8
libs/libcodec2/src/fq20.sh
Executable file
8
libs/libcodec2/src/fq20.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# fq20.shsh
|
||||||
|
# David Rowe 27 July 2010
|
||||||
|
#
|
||||||
|
# Decode a file with fully quantised codec at 20ms frame rate
|
||||||
|
|
||||||
|
../src/sinedec ../raw/$1.raw $1.mdl -o $1_phase0_lsp_20_EWo2.raw --phase 0 --lpc 10 --lsp --postfilter --dec
|
||||||
|
|
50
libs/libcodec2/src/globals.c
Normal file
50
libs/libcodec2/src/globals.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: globals.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 11/5/94
|
||||||
|
|
||||||
|
Globals for sinusoidal speech coder.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sine.h" /* global defines for coder */
|
||||||
|
|
||||||
|
/* Globals used in encoder and decoder */
|
||||||
|
|
||||||
|
int frames; /* number of frames processed so far */
|
||||||
|
float Sn[M]; /* float input speech samples */
|
||||||
|
MODEL model; /* model parameters for the current frame */
|
||||||
|
int Nw; /* number of samples in analysis window */
|
||||||
|
float sig; /* energy of current frame */
|
||||||
|
|
||||||
|
/* Globals used in encoder */
|
||||||
|
|
||||||
|
float w[M]; /* time domain hamming window */
|
||||||
|
COMP W[FFT_ENC]; /* DFT of w[] */
|
||||||
|
COMP Sw[FFT_ENC]; /* DFT of current frame */
|
||||||
|
|
||||||
|
/* Globals used in decoder */
|
||||||
|
|
||||||
|
COMP Sw_[FFT_ENC]; /* DFT of all voiced synthesised signal */
|
||||||
|
float Sn_[AW_DEC]; /* synthesised speech */
|
||||||
|
float Pn[AW_DEC]; /* time domain Parzen (trapezoidal) window */
|
||||||
|
|
48
libs/libcodec2/src/globals.h
Normal file
48
libs/libcodec2/src/globals.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: globals.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 1/11/94
|
||||||
|
|
||||||
|
Globals for sinusoidal speech coder.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Globals used in encoder and decoder */
|
||||||
|
|
||||||
|
extern int frames; /* number of frames processed so far */
|
||||||
|
extern float Sn[]; /* float input speech samples */
|
||||||
|
extern MODEL model; /* model parameters for the current frame */
|
||||||
|
extern int Nw; /* number of samples in analysis window */
|
||||||
|
extern float sig; /* energy of current frame */
|
||||||
|
|
||||||
|
/* Globals used in encoder */
|
||||||
|
|
||||||
|
extern float w[]; /* time domain hamming window */
|
||||||
|
extern COMP W[]; /* frequency domain hamming window */
|
||||||
|
extern COMP Sw[]; /* DFT of current frame */
|
||||||
|
extern COMP Sw_[]; /* DFT of all voiced synthesised signal */
|
||||||
|
|
||||||
|
/* Globals used in decoder */
|
||||||
|
|
||||||
|
extern float Sn_[]; /* output synthesised speech samples */
|
||||||
|
extern float Pn[]; /* time domain Parzen (trapezoidal) window */
|
||||||
|
|
122
libs/libcodec2/src/interp.c
Normal file
122
libs/libcodec2/src/interp.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: interp.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 9/10/09
|
||||||
|
|
||||||
|
Interpolation of 20ms frames to 10ms frames.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "interp.h"
|
||||||
|
|
||||||
|
float sample_log_amp(MODEL *model, float w);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: interp()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 22/8/10
|
||||||
|
|
||||||
|
Given two frames decribed by model parameters 20ms apart, determines
|
||||||
|
the model parameters of the 10ms frame between them. Assumes
|
||||||
|
voicing is available for middle (interpolated) frame. Outputs are
|
||||||
|
amplitudes and Wo for the interpolated frame.
|
||||||
|
|
||||||
|
This version can interpolate the amplitudes between two frames of
|
||||||
|
different Wo and L.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void interpolate(
|
||||||
|
MODEL *interp, /* interpolated model params */
|
||||||
|
MODEL *prev, /* previous frames model params */
|
||||||
|
MODEL *next /* next frames model params */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
float w,log_amp;
|
||||||
|
|
||||||
|
/* Wo depends on voicing of this and adjacent frames */
|
||||||
|
|
||||||
|
if (interp->voiced) {
|
||||||
|
if (prev->voiced && next->voiced)
|
||||||
|
interp->Wo = (prev->Wo + next->Wo)/2.0;
|
||||||
|
if (!prev->voiced && next->voiced)
|
||||||
|
interp->Wo = next->Wo;
|
||||||
|
if (prev->voiced && !next->voiced)
|
||||||
|
interp->Wo = prev->Wo;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
interp->Wo = TWO_PI/P_MAX;
|
||||||
|
}
|
||||||
|
interp->L = PI/interp->Wo;
|
||||||
|
|
||||||
|
/* Interpolate amplitudes using linear interpolation in log domain */
|
||||||
|
|
||||||
|
for(l=1; l<=interp->L; l++) {
|
||||||
|
w = l*interp->Wo;
|
||||||
|
log_amp = (sample_log_amp(prev, w) + sample_log_amp(next, w))/2.0;
|
||||||
|
interp->A[l] = pow(10.0, log_amp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: sample_log_amp()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 22/8/10
|
||||||
|
|
||||||
|
Samples the amplitude envelope at an arbitrary frequency w. Uses
|
||||||
|
linear interpolation in the log domain to sample between harmonic
|
||||||
|
amplitudes.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
float sample_log_amp(MODEL *model, float w)
|
||||||
|
{
|
||||||
|
int m;
|
||||||
|
float f, log_amp;
|
||||||
|
|
||||||
|
assert(w > 0.0); assert (w <= PI);
|
||||||
|
|
||||||
|
m = floor(w/model->Wo + 0.5);
|
||||||
|
f = (w - m*model->Wo)/w;
|
||||||
|
assert(f <= 1.0);
|
||||||
|
|
||||||
|
if (m < 1) {
|
||||||
|
log_amp = f*log10(model->A[1]);
|
||||||
|
}
|
||||||
|
else if ((m+1) > model->L) {
|
||||||
|
log_amp = (1.0-f)*log10(model->A[model->L]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_amp = (1.0-f)*log10(model->A[m]) + f*log10(model->A[m+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return log_amp;
|
||||||
|
}
|
||||||
|
|
34
libs/libcodec2/src/interp.h
Normal file
34
libs/libcodec2/src/interp.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: interp.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 9/10/09
|
||||||
|
|
||||||
|
Interpolation of 20ms frames to 10ms frames.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __INTERP__
|
||||||
|
#define __INTERP__
|
||||||
|
|
||||||
|
void interpolate(MODEL *interp, MODEL *prev, MODEL *next);
|
||||||
|
|
||||||
|
#endif
|
9
libs/libcodec2/src/listen.sh
Normal file
9
libs/libcodec2/src/listen.sh
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# listensim.sh
|
||||||
|
# David Rowe 10 Sep 2009
|
||||||
|
#
|
||||||
|
# Listen to files processed with sim.sh
|
||||||
|
|
||||||
|
../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw $1_phase0_lsp.raw $2 $3
|
||||||
|
|
||||||
|
|
15
libs/libcodec2/src/listen1.sh
Executable file
15
libs/libcodec2/src/listen1.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# listen1.sh
|
||||||
|
# David Rowe 10 Sep 2009
|
||||||
|
#
|
||||||
|
# Run menu with common sample file options, headphone version
|
||||||
|
|
||||||
|
#../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw ../raw/$1_g729a.raw $2 $3 -d /dev/dsp1
|
||||||
|
|
||||||
|
# compare to other codecs
|
||||||
|
|
||||||
|
#../script/menu.sh ../raw/$1.raw $1_phase0_lsp.raw $1_phase0_lsp_20.raw ../raw/$1_g729a.raw ../raw/$1_gsm13k.raw ../raw/$1_speex_8k.raw $2 $3 -d /dev/dsp1
|
||||||
|
|
||||||
|
../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_test.raw ../raw/$1_g729a.raw $2 $3 -d /dev/dsp1
|
||||||
|
|
||||||
|
|
9
libs/libcodec2/src/listensim.sh
Executable file
9
libs/libcodec2/src/listensim.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# listensim.sh
|
||||||
|
# David Rowe 10 Sep 2009
|
||||||
|
#
|
||||||
|
# Listen to files processed with sim.sh
|
||||||
|
|
||||||
|
../script/menu.sh ../raw/$1.raw $1_uq.raw $1_phase0.raw $1_lpc10.raw $1_lsp.raw $1_phase0_lpc10.raw $1_phase0_lsp.raw $1_phase0_lsp_dec.raw $2 $3
|
||||||
|
|
||||||
|
|
253
libs/libcodec2/src/lpc.c
Normal file
253
libs/libcodec2/src/lpc.c
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: lpc.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 30/9/90
|
||||||
|
|
||||||
|
Linear Prediction functions written in C.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LPC_MAX_N 512 /* maximum no. of samples in frame */
|
||||||
|
#define PI 3.141592654 /* mathematical constant */
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "defines.h"
|
||||||
|
#include "lpc.h"
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
hanning_window()
|
||||||
|
|
||||||
|
Hanning windows a frame of speech samples.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void hanning_window(
|
||||||
|
float Sn[], /* input frame of speech samples */
|
||||||
|
float Wn[], /* output frame of windowed samples */
|
||||||
|
int Nsam /* number of samples */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i; /* loop variable */
|
||||||
|
|
||||||
|
for(i=0; i<Nsam; i++)
|
||||||
|
Wn[i] = Sn[i]*(0.5 - 0.5*cos(2*PI*(float)i/(Nsam-1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
autocorrelate()
|
||||||
|
|
||||||
|
Finds the first P autocorrelation values of an array of windowed speech
|
||||||
|
samples Sn[].
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void autocorrelate(
|
||||||
|
float Sn[], /* frame of Nsam windowed speech samples */
|
||||||
|
float Rn[], /* array of P+1 autocorrelation coefficients */
|
||||||
|
int Nsam, /* number of windowed samples to use */
|
||||||
|
int order /* order of LPC analysis */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i,j; /* loop variables */
|
||||||
|
|
||||||
|
for(j=0; j<order+1; j++) {
|
||||||
|
Rn[j] = 0.0;
|
||||||
|
for(i=0; i<Nsam-j; i++)
|
||||||
|
Rn[j] += Sn[i]*Sn[i+j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
levinson_durbin()
|
||||||
|
|
||||||
|
Given P+1 autocorrelation coefficients, finds P Linear Prediction Coeff.
|
||||||
|
(LPCs) where P is the order of the LPC all-pole model. The Levinson-Durbin
|
||||||
|
algorithm is used, and is described in:
|
||||||
|
|
||||||
|
J. Makhoul
|
||||||
|
"Linear prediction, a tutorial review"
|
||||||
|
Proceedings of the IEEE
|
||||||
|
Vol-63, No. 4, April 1975
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void levinson_durbin(
|
||||||
|
float R[], /* order+1 autocorrelation coeff */
|
||||||
|
float lpcs[], /* order+1 LPC's */
|
||||||
|
int order /* order of the LPC analysis */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
float E[LPC_MAX+1];
|
||||||
|
float k[LPC_MAX+1];
|
||||||
|
float a[LPC_MAX+1][LPC_MAX+1];
|
||||||
|
float sum;
|
||||||
|
int i,j; /* loop variables */
|
||||||
|
|
||||||
|
E[0] = R[0]; /* Equation 38a, Makhoul */
|
||||||
|
|
||||||
|
for(i=1; i<=order; i++) {
|
||||||
|
sum = 0.0;
|
||||||
|
for(j=1; j<=i-1; j++)
|
||||||
|
sum += a[i-1][j]*R[i-j];
|
||||||
|
k[i] = -1.0*(R[i] + sum)/E[i-1]; /* Equation 38b, Makhoul */
|
||||||
|
if (fabs(k[i]) > 1.0)
|
||||||
|
k[i] = 0.0;
|
||||||
|
|
||||||
|
a[i][i] = k[i];
|
||||||
|
|
||||||
|
for(j=1; j<=i-1; j++)
|
||||||
|
a[i][j] = a[i-1][j] + k[i]*a[i-1][i-j]; /* Equation 38c, Makhoul */
|
||||||
|
|
||||||
|
E[i] = (1-k[i]*k[i])*E[i-1]; /* Equation 38d, Makhoul */
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=1; i<=order; i++)
|
||||||
|
lpcs[i] = a[order][i];
|
||||||
|
lpcs[0] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
inverse_filter()
|
||||||
|
|
||||||
|
Inverse Filter, A(z). Produces an array of residual samples from an array
|
||||||
|
of input samples and linear prediction coefficients.
|
||||||
|
|
||||||
|
The filter memory is stored in the first order samples of the input array.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void inverse_filter(
|
||||||
|
float Sn[], /* Nsam input samples */
|
||||||
|
float a[], /* LPCs for this frame of samples */
|
||||||
|
int Nsam, /* number of samples */
|
||||||
|
float res[], /* Nsam residual samples */
|
||||||
|
int order /* order of LPC */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i,j; /* loop variables */
|
||||||
|
|
||||||
|
for(i=0; i<Nsam; i++) {
|
||||||
|
res[i] = 0.0;
|
||||||
|
for(j=0; j<=order; j++)
|
||||||
|
res[i] += Sn[i-j]*a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
synthesis_filter()
|
||||||
|
|
||||||
|
C version of the Speech Synthesis Filter, 1/A(z). Given an array of
|
||||||
|
residual or excitation samples, and the the LP filter coefficients, this
|
||||||
|
function will produce an array of speech samples. This filter structure is
|
||||||
|
IIR.
|
||||||
|
|
||||||
|
The synthesis filter has memory as well, this is treated in the same way
|
||||||
|
as the memory for the inverse filter (see inverse_filter() notes above).
|
||||||
|
The difference is that the memory for the synthesis filter is stored in
|
||||||
|
the output array, wheras the memory of the inverse filter is stored in the
|
||||||
|
input array.
|
||||||
|
|
||||||
|
Note: the calling function must update the filter memory.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void synthesis_filter(
|
||||||
|
float res[], /* Nsam input residual (excitation) samples */
|
||||||
|
float a[], /* LPCs for this frame of speech samples */
|
||||||
|
int Nsam, /* number of speech samples */
|
||||||
|
int order, /* LPC order */
|
||||||
|
float Sn_[] /* Nsam output synthesised speech samples */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i,j; /* loop variables */
|
||||||
|
|
||||||
|
/* Filter Nsam samples */
|
||||||
|
|
||||||
|
for(i=0; i<Nsam; i++) {
|
||||||
|
Sn_[i] = res[i]*a[0];
|
||||||
|
for(j=1; j<=order; j++)
|
||||||
|
Sn_[i] -= Sn_[i-j]*a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
find_aks()
|
||||||
|
|
||||||
|
This function takes a frame of samples, and determines the linear
|
||||||
|
prediction coefficients for that frame of samples.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void find_aks(
|
||||||
|
float Sn[], /* Nsam samples with order sample memory */
|
||||||
|
float a[], /* order+1 LPCs with first coeff 1.0 */
|
||||||
|
int Nsam, /* number of input speech samples */
|
||||||
|
int order, /* order of the LPC analysis */
|
||||||
|
float *E /* residual energy */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
float Wn[LPC_MAX_N]; /* windowed frame of Nsam speech samples */
|
||||||
|
float R[LPC_MAX+1]; /* order+1 autocorrelation values of Sn[] */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
assert(order < LPC_MAX);
|
||||||
|
assert(Nsam < LPC_MAX_N);
|
||||||
|
|
||||||
|
hanning_window(Sn,Wn,Nsam);
|
||||||
|
autocorrelate(Wn,R,Nsam,order);
|
||||||
|
levinson_durbin(R,a,order);
|
||||||
|
|
||||||
|
*E = 0.0;
|
||||||
|
for(i=0; i<=order; i++)
|
||||||
|
*E += a[i]*R[i];
|
||||||
|
if (*E < 0.0)
|
||||||
|
*E = 1E-12;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
weight()
|
||||||
|
|
||||||
|
Weights a vector of LPCs.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void weight(
|
||||||
|
float ak[], /* vector of order+1 LPCs */
|
||||||
|
float gamma, /* weighting factor */
|
||||||
|
int order, /* num LPCs (excluding leading 1.0) */
|
||||||
|
float akw[] /* weighted vector of order+1 LPCs */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=1; i<=order; i++)
|
||||||
|
akw[i] = ak[i]*pow(gamma,(float)i);
|
||||||
|
}
|
||||||
|
|
42
libs/libcodec2/src/lpc.h
Normal file
42
libs/libcodec2/src/lpc.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: lpc.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/8/09
|
||||||
|
|
||||||
|
Linear Prediction functions written in C.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LPC__
|
||||||
|
#define __LPC__
|
||||||
|
|
||||||
|
#define LPC_MAX_ORDER 20
|
||||||
|
|
||||||
|
void hanning_window(float Sn[], float Wn[], int Nsam);
|
||||||
|
void autocorrelate(float Sn[], float Rn[], int Nsam, int order);
|
||||||
|
void levinson_durbin(float R[], float lpcs[], int order);
|
||||||
|
void inverse_filter(float Sn[], float a[], int Nsam, float res[], int order);
|
||||||
|
void synthesis_filter(float res[], float a[], int Nsam, int order, float Sn_[]);
|
||||||
|
void find_aks(float Sn[], float a[], int Nsam, int order, float *E);
|
||||||
|
void weight(float ak[], float gamma, int order, float akw[]);
|
||||||
|
|
||||||
|
#endif
|
323
libs/libcodec2/src/lsp.c
Normal file
323
libs/libcodec2/src/lsp.c
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: lsp.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/2/93
|
||||||
|
|
||||||
|
|
||||||
|
This file contains functions for LPC to LSP conversion and LSP to
|
||||||
|
LPC conversion. Note that the LSP coefficients are not in radians
|
||||||
|
format but in the x domain of the unit circle.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "lsp.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
Introduction to Line Spectrum Pairs (LSPs)
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
LSPs are used to encode the LPC filter coefficients {ak} for
|
||||||
|
transmission over the channel. LSPs have several properties (like
|
||||||
|
less sensitivity to quantisation noise) that make them superior to
|
||||||
|
direct quantisation of {ak}.
|
||||||
|
|
||||||
|
A(z) is a polynomial of order lpcrdr with {ak} as the coefficients.
|
||||||
|
|
||||||
|
A(z) is transformed to P(z) and Q(z) (using a substitution and some
|
||||||
|
algebra), to obtain something like:
|
||||||
|
|
||||||
|
A(z) = 0.5[P(z)(z+z^-1) + Q(z)(z-z^-1)] (1)
|
||||||
|
|
||||||
|
As you can imagine A(z) has complex zeros all over the z-plane. P(z)
|
||||||
|
and Q(z) have the very neat property of only having zeros _on_ the
|
||||||
|
unit circle. So to find them we take a test point z=exp(jw) and
|
||||||
|
evaluate P (exp(jw)) and Q(exp(jw)) using a grid of points between 0
|
||||||
|
and pi.
|
||||||
|
|
||||||
|
The zeros (roots) of P(z) also happen to alternate, which is why we
|
||||||
|
swap coefficients as we find roots. So the process of finding the
|
||||||
|
LSP frequencies is basically finding the roots of 5th order
|
||||||
|
polynomials.
|
||||||
|
|
||||||
|
The root so P(z) and Q(z) occur in symmetrical pairs at +/-w, hence
|
||||||
|
the name Line Spectrum Pairs (LSPs).
|
||||||
|
|
||||||
|
To convert back to ak we just evaluate (1), "clocking" an impulse
|
||||||
|
thru it lpcrdr times gives us the impulse response of A(z) which is
|
||||||
|
{ak}.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: cheb_poly_eva()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/2/93
|
||||||
|
|
||||||
|
This function evalutes a series of chebyshev polynomials
|
||||||
|
|
||||||
|
FIXME: performing memory allocation at run time is very inefficient,
|
||||||
|
replace with stack variables of MAX_P size.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
float cheb_poly_eva(float *coef,float x,int m)
|
||||||
|
/* float coef[] coefficients of the polynomial to be evaluated */
|
||||||
|
/* float x the point where polynomial is to be evaluated */
|
||||||
|
/* int m order of the polynomial */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
float *T,*t,*u,*v,sum;
|
||||||
|
|
||||||
|
/* Allocate memory for chebyshev series formulation */
|
||||||
|
|
||||||
|
if((T = (float *)malloc((m/2+1)*sizeof(float))) == NULL){
|
||||||
|
fprintf(stderr, "not enough memory to allocate buffer\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialise pointers */
|
||||||
|
|
||||||
|
t = T; /* T[i-2] */
|
||||||
|
*t++ = 1.0;
|
||||||
|
u = t--; /* T[i-1] */
|
||||||
|
*u++ = x;
|
||||||
|
v = u--; /* T[i] */
|
||||||
|
|
||||||
|
/* Evaluate chebyshev series formulation using iterative approach */
|
||||||
|
|
||||||
|
for(i=2;i<=m/2;i++)
|
||||||
|
*v++ = (2*x)*(*u++) - *t++; /* T[i] = 2*x*T[i-1] - T[i-2] */
|
||||||
|
|
||||||
|
sum=0.0; /* initialise sum to zero */
|
||||||
|
t = T; /* reset pointer */
|
||||||
|
|
||||||
|
/* Evaluate polynomial and return value also free memory space */
|
||||||
|
|
||||||
|
for(i=0;i<=m/2;i++)
|
||||||
|
sum+=coef[(m/2)-i]**t++;
|
||||||
|
|
||||||
|
free(T);
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: lpc_to_lsp()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/2/93
|
||||||
|
|
||||||
|
This function converts LPC coefficients to LSP coefficients.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta)
|
||||||
|
/* float *a lpc coefficients */
|
||||||
|
/* int lpcrdr order of LPC coefficients (10) */
|
||||||
|
/* float *freq LSP frequencies in radians */
|
||||||
|
/* int nb number of sub-intervals (4) */
|
||||||
|
/* float delta grid spacing interval (0.02) */
|
||||||
|
{
|
||||||
|
float psuml,psumr,psumm,temp_xr,xl,xr,xm;
|
||||||
|
float temp_psumr;
|
||||||
|
int i,j,m,flag,k;
|
||||||
|
float *Q; /* ptrs for memory allocation */
|
||||||
|
float *P;
|
||||||
|
float *px; /* ptrs of respective P'(z) & Q'(z) */
|
||||||
|
float *qx;
|
||||||
|
float *p;
|
||||||
|
float *q;
|
||||||
|
float *pt; /* ptr used for cheb_poly_eval()
|
||||||
|
whether P' or Q' */
|
||||||
|
int roots=0; /* number of roots found */
|
||||||
|
flag = 1;
|
||||||
|
m = lpcrdr/2; /* order of P'(z) & Q'(z) polynimials */
|
||||||
|
|
||||||
|
/* Allocate memory space for polynomials */
|
||||||
|
|
||||||
|
Q = (float *) malloc((m+1)*sizeof(float));
|
||||||
|
P = (float *) malloc((m+1)*sizeof(float));
|
||||||
|
if( (P == NULL) || (Q == NULL) ) {
|
||||||
|
fprintf(stderr,"not enough memory to allocate buffer\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* determine P'(z)'s and Q'(z)'s coefficients where
|
||||||
|
P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */
|
||||||
|
|
||||||
|
px = P; /* initilaise ptrs */
|
||||||
|
qx = Q;
|
||||||
|
p = px;
|
||||||
|
q = qx;
|
||||||
|
*px++ = 1.0;
|
||||||
|
*qx++ = 1.0;
|
||||||
|
for(i=1;i<=m;i++){
|
||||||
|
*px++ = a[i]+a[lpcrdr+1-i]-*p++;
|
||||||
|
*qx++ = a[i]-a[lpcrdr+1-i]+*q++;
|
||||||
|
}
|
||||||
|
px = P;
|
||||||
|
qx = Q;
|
||||||
|
for(i=0;i<m;i++){
|
||||||
|
*px = 2**px;
|
||||||
|
*qx = 2**qx;
|
||||||
|
px++;
|
||||||
|
qx++;
|
||||||
|
}
|
||||||
|
px = P; /* re-initialise ptrs */
|
||||||
|
qx = Q;
|
||||||
|
|
||||||
|
/* Search for a zero in P'(z) polynomial first and then alternate to Q'(z).
|
||||||
|
Keep alternating between the two polynomials as each zero is found */
|
||||||
|
|
||||||
|
xr = 0; /* initialise xr to zero */
|
||||||
|
xl = 1.0; /* start at point xl = 1 */
|
||||||
|
|
||||||
|
|
||||||
|
for(j=0;j<lpcrdr;j++){
|
||||||
|
if(j%2) /* determines whether P' or Q' is eval. */
|
||||||
|
pt = qx;
|
||||||
|
else
|
||||||
|
pt = px;
|
||||||
|
|
||||||
|
psuml = cheb_poly_eva(pt,xl,lpcrdr); /* evals poly. at xl */
|
||||||
|
flag = 1;
|
||||||
|
while(flag && (xr >= -1.0)){
|
||||||
|
xr = xl - delta ; /* interval spacing */
|
||||||
|
psumr = cheb_poly_eva(pt,xr,lpcrdr);/* poly(xl-delta_x) */
|
||||||
|
temp_psumr = psumr;
|
||||||
|
temp_xr = xr;
|
||||||
|
|
||||||
|
/* if no sign change increment xr and re-evaluate
|
||||||
|
poly(xr). Repeat til sign change. if a sign change has
|
||||||
|
occurred the interval is bisected and then checked again
|
||||||
|
for a sign change which determines in which interval the
|
||||||
|
zero lies in. If there is no sign change between poly(xm)
|
||||||
|
and poly(xl) set interval between xm and xr else set
|
||||||
|
interval between xl and xr and repeat till root is located
|
||||||
|
within the specified limits */
|
||||||
|
|
||||||
|
if((psumr*psuml)<0.0){
|
||||||
|
roots++;
|
||||||
|
|
||||||
|
psumm=psuml;
|
||||||
|
for(k=0;k<=nb;k++){
|
||||||
|
xm = (xl+xr)/2; /* bisect the interval */
|
||||||
|
psumm=cheb_poly_eva(pt,xm,lpcrdr);
|
||||||
|
if(psumm*psuml>0.){
|
||||||
|
psuml=psumm;
|
||||||
|
xl=xm;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
psumr=psumm;
|
||||||
|
xr=xm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* once zero is found, reset initial interval to xr */
|
||||||
|
freq[j] = (xm);
|
||||||
|
xl = xm;
|
||||||
|
flag = 0; /* reset flag for next search */
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
psuml=temp_psumr;
|
||||||
|
xl=temp_xr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(P); /* free memory space */
|
||||||
|
free(Q);
|
||||||
|
|
||||||
|
/* convert from x domain to radians */
|
||||||
|
|
||||||
|
for(i=0; i<lpcrdr; i++) {
|
||||||
|
freq[i] = acos(freq[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(roots);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FUNCTION....: lsp_to_lpc()
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/2/93
|
||||||
|
|
||||||
|
This function converts LSP coefficients to LPC coefficients. In the
|
||||||
|
Speex code we worked out a wayto simplify this significantly.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void lsp_to_lpc(float *freq, float *ak, int lpcrdr)
|
||||||
|
/* float *freq array of LSP frequencies in radians */
|
||||||
|
/* float *ak array of LPC coefficients */
|
||||||
|
/* int lpcrdr order of LPC coefficients */
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
float xout1,xout2,xin1,xin2;
|
||||||
|
float *Wp;
|
||||||
|
float *pw,*n1,*n2,*n3,*n4;
|
||||||
|
int m = lpcrdr/2;
|
||||||
|
|
||||||
|
/* convert from radians to the x=cos(w) domain */
|
||||||
|
|
||||||
|
for(i=0; i<lpcrdr; i++)
|
||||||
|
freq[i] = cos(freq[i]);
|
||||||
|
|
||||||
|
if((Wp = (float *) malloc((4*m+2)*sizeof(float))) == NULL){
|
||||||
|
printf("not enough memory to allocate buffer\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
pw = Wp;
|
||||||
|
|
||||||
|
/* initialise contents of array */
|
||||||
|
|
||||||
|
for(i=0;i<=4*m+1;i++){ /* set contents of buffer to 0 */
|
||||||
|
*pw++ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set pointers up */
|
||||||
|
|
||||||
|
pw = Wp;
|
||||||
|
xin1 = 1.0;
|
||||||
|
xin2 = 1.0;
|
||||||
|
|
||||||
|
/* reconstruct P(z) and Q(z) by cascading second order polynomials
|
||||||
|
in form 1 - 2xz(-1) +z(-2), where x is the LSP coefficient */
|
||||||
|
|
||||||
|
for(j=0;j<=lpcrdr;j++){
|
||||||
|
for(i=0;i<m;i++){
|
||||||
|
n1 = pw+(i*4);
|
||||||
|
n2 = n1 + 1;
|
||||||
|
n3 = n2 + 1;
|
||||||
|
n4 = n3 + 1;
|
||||||
|
xout1 = xin1 - 2*(freq[2*i]) * *n1 + *n2;
|
||||||
|
xout2 = xin2 - 2*(freq[2*i+1]) * *n3 + *n4;
|
||||||
|
*n2 = *n1;
|
||||||
|
*n4 = *n3;
|
||||||
|
*n1 = xin1;
|
||||||
|
*n3 = xin2;
|
||||||
|
xin1 = xout1;
|
||||||
|
xin2 = xout2;
|
||||||
|
}
|
||||||
|
xout1 = xin1 + *(n4+1);
|
||||||
|
xout2 = xin2 - *(n4+2);
|
||||||
|
ak[j] = (xout1 + xout2)*0.5;
|
||||||
|
*(n4+1) = xin1;
|
||||||
|
*(n4+2) = xin2;
|
||||||
|
|
||||||
|
xin1 = 0.0;
|
||||||
|
xin2 = 0.0;
|
||||||
|
}
|
||||||
|
free(Wp);
|
||||||
|
}
|
||||||
|
|
20
libs/libcodec2/src/lsp.h
Normal file
20
libs/libcodec2/src/lsp.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: lsp.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 24/2/93
|
||||||
|
|
||||||
|
|
||||||
|
This file contains functions for LPC to LSP conversion and LSP to
|
||||||
|
LPC conversion. Note that the LSP coefficients are not in radians
|
||||||
|
format but in the x domain of the unit circle.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __LSP__
|
||||||
|
#define __LSP__
|
||||||
|
|
||||||
|
int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta);
|
||||||
|
void lsp_to_lpc(float *freq, float *ak, int lpcrdr);
|
||||||
|
|
||||||
|
#endif
|
361
libs/libcodec2/src/nlp.c
Normal file
361
libs/libcodec2/src/nlp.c
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: nlp.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/3/93
|
||||||
|
|
||||||
|
Non Linear Pitch (NLP) estimation functions.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "nlp.h"
|
||||||
|
#include "dump.h"
|
||||||
|
#include "four1.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
DEFINES
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define PMAX_M 600 /* maximum NLP analysis window size */
|
||||||
|
#define COEFF 0.95 /* notch filter parameter */
|
||||||
|
#define PE_FFT_SIZE 512 /* DFT size for pitch estimation */
|
||||||
|
#define DEC 5 /* decimation factor */
|
||||||
|
#define SAMPLE_RATE 8000
|
||||||
|
#define PI 3.141592654 /* mathematical constant */
|
||||||
|
#define T 0.1 /* threshold for local minima candidate */
|
||||||
|
#define F0_MAX 500
|
||||||
|
#define CNLP 0.3 /* post processor constant */
|
||||||
|
#define NLP_NTAP 48 /* Decimation LPF order */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
GLOBALS
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* 48 tap 600Hz low pass FIR filter coefficients */
|
||||||
|
|
||||||
|
float nlp_fir[] = {
|
||||||
|
-1.0818124e-03,
|
||||||
|
-1.1008344e-03,
|
||||||
|
-9.2768838e-04,
|
||||||
|
-4.2289438e-04,
|
||||||
|
5.5034190e-04,
|
||||||
|
2.0029849e-03,
|
||||||
|
3.7058509e-03,
|
||||||
|
5.1449415e-03,
|
||||||
|
5.5924666e-03,
|
||||||
|
4.3036754e-03,
|
||||||
|
8.0284511e-04,
|
||||||
|
-4.8204610e-03,
|
||||||
|
-1.1705810e-02,
|
||||||
|
-1.8199275e-02,
|
||||||
|
-2.2065282e-02,
|
||||||
|
-2.0920610e-02,
|
||||||
|
-1.2808831e-02,
|
||||||
|
3.2204775e-03,
|
||||||
|
2.6683811e-02,
|
||||||
|
5.5520624e-02,
|
||||||
|
8.6305944e-02,
|
||||||
|
1.1480192e-01,
|
||||||
|
1.3674206e-01,
|
||||||
|
1.4867556e-01,
|
||||||
|
1.4867556e-01,
|
||||||
|
1.3674206e-01,
|
||||||
|
1.1480192e-01,
|
||||||
|
8.6305944e-02,
|
||||||
|
5.5520624e-02,
|
||||||
|
2.6683811e-02,
|
||||||
|
3.2204775e-03,
|
||||||
|
-1.2808831e-02,
|
||||||
|
-2.0920610e-02,
|
||||||
|
-2.2065282e-02,
|
||||||
|
-1.8199275e-02,
|
||||||
|
-1.1705810e-02,
|
||||||
|
-4.8204610e-03,
|
||||||
|
8.0284511e-04,
|
||||||
|
4.3036754e-03,
|
||||||
|
5.5924666e-03,
|
||||||
|
5.1449415e-03,
|
||||||
|
3.7058509e-03,
|
||||||
|
2.0029849e-03,
|
||||||
|
5.5034190e-04,
|
||||||
|
-4.2289438e-04,
|
||||||
|
-9.2768838e-04,
|
||||||
|
-1.1008344e-03,
|
||||||
|
-1.0818124e-03
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float sq[PMAX_M]; /* squared speech samples */
|
||||||
|
float mem_x,mem_y; /* memory for notch filter */
|
||||||
|
float mem_fir[NLP_NTAP]; /* decimation FIR filter memory */
|
||||||
|
} NLP;
|
||||||
|
|
||||||
|
float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax);
|
||||||
|
float post_process_sub_multiples(COMP Fw[],
|
||||||
|
int pmin, int pmax, float gmax, int gmax_bin,
|
||||||
|
float *prev_Wo);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
nlp_create()
|
||||||
|
|
||||||
|
Initialisation function for NLP pitch estimator.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void *nlp_create()
|
||||||
|
{
|
||||||
|
NLP *nlp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
nlp = (NLP*)malloc(sizeof(NLP));
|
||||||
|
if (nlp == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for(i=0; i<PMAX_M; i++)
|
||||||
|
nlp->sq[i] = 0.0;
|
||||||
|
nlp->mem_x = 0.0;
|
||||||
|
nlp->mem_y = 0.0;
|
||||||
|
for(i=0; i<NLP_NTAP; i++)
|
||||||
|
nlp->mem_fir[i] = 0.0;
|
||||||
|
|
||||||
|
return (void*)nlp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
nlp_destory()
|
||||||
|
|
||||||
|
Initialisation function for NLP pitch estimator.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void nlp_destroy(void *nlp_state)
|
||||||
|
{
|
||||||
|
assert(nlp_state != NULL);
|
||||||
|
free(nlp_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
nlp()
|
||||||
|
|
||||||
|
Determines the pitch in samples using the Non Linear Pitch (NLP)
|
||||||
|
algorithm [1]. Returns the fundamental in Hz. Note that the actual
|
||||||
|
pitch estimate is for the centre of the M sample Sn[] vector, not
|
||||||
|
the current N sample input vector. This is (I think) a delay of 2.5
|
||||||
|
frames with N=80 samples. You should align further analysis using
|
||||||
|
this pitch estimate to be centred on the middle of Sn[].
|
||||||
|
|
||||||
|
Two post processors have been tried, the MBE version (as discussed
|
||||||
|
in [1]), and a post processor that checks sub-multiples. Both
|
||||||
|
suffer occasional gross pitch errors (i.e. neither are perfect). In
|
||||||
|
the presence of background noise the sub-multiple algorithm tends
|
||||||
|
towards low F0 which leads to better sounding background noise than
|
||||||
|
the MBE post processor.
|
||||||
|
|
||||||
|
A good way to test and develop the NLP pitch estimator is using the
|
||||||
|
tnlp (codec2/unittest) and the codec2/octave/plnlp.m Octave script.
|
||||||
|
|
||||||
|
A pitch tracker searching a few frames forward and backward in time
|
||||||
|
would be a useful addition.
|
||||||
|
|
||||||
|
References:
|
||||||
|
|
||||||
|
[1] http://www.itr.unisa.edu.au/~steven/thesis/dgr.pdf Chapter 4
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
float nlp(
|
||||||
|
void *nlp_state,
|
||||||
|
float Sn[], /* input speech vector */
|
||||||
|
int n, /* frames shift (no. new samples in Sn[]) */
|
||||||
|
int m, /* analysis window size */
|
||||||
|
int pmin, /* minimum pitch value */
|
||||||
|
int pmax, /* maximum pitch value */
|
||||||
|
float *pitch, /* estimated pitch period in samples */
|
||||||
|
COMP Sw[], /* Freq domain version of Sn[] */
|
||||||
|
float *prev_Wo
|
||||||
|
)
|
||||||
|
{
|
||||||
|
NLP *nlp;
|
||||||
|
float notch; /* current notch filter output */
|
||||||
|
COMP Fw[PE_FFT_SIZE]; /* DFT of squared signal */
|
||||||
|
float gmax;
|
||||||
|
int gmax_bin;
|
||||||
|
int i,j;
|
||||||
|
float best_f0;
|
||||||
|
|
||||||
|
assert(nlp_state != NULL);
|
||||||
|
nlp = (NLP*)nlp_state;
|
||||||
|
|
||||||
|
/* Square, notch filter at DC, and LP filter vector */
|
||||||
|
|
||||||
|
for(i=m-n; i<M; i++) /* square latest speech samples */
|
||||||
|
nlp->sq[i] = Sn[i]*Sn[i];
|
||||||
|
|
||||||
|
for(i=m-n; i<m; i++) { /* notch filter at DC */
|
||||||
|
notch = nlp->sq[i] - nlp->mem_x;
|
||||||
|
notch += COEFF*nlp->mem_y;
|
||||||
|
nlp->mem_x = nlp->sq[i];
|
||||||
|
nlp->mem_y = notch;
|
||||||
|
nlp->sq[i] = notch;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=m-n; i<m; i++) { /* FIR filter vector */
|
||||||
|
|
||||||
|
for(j=0; j<NLP_NTAP-1; j++)
|
||||||
|
nlp->mem_fir[j] = nlp->mem_fir[j+1];
|
||||||
|
nlp->mem_fir[NLP_NTAP-1] = nlp->sq[i];
|
||||||
|
|
||||||
|
nlp->sq[i] = 0.0;
|
||||||
|
for(j=0; j<NLP_NTAP; j++)
|
||||||
|
nlp->sq[i] += nlp->mem_fir[j]*nlp_fir[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decimate and DFT */
|
||||||
|
|
||||||
|
for(i=0; i<PE_FFT_SIZE; i++) {
|
||||||
|
Fw[i].real = 0.0;
|
||||||
|
Fw[i].imag = 0.0;
|
||||||
|
}
|
||||||
|
for(i=0; i<m/DEC; i++) {
|
||||||
|
Fw[i].real = nlp->sq[i*DEC]*(0.5 - 0.5*cos(2*PI*i/(m/DEC-1)));
|
||||||
|
}
|
||||||
|
dump_dec(Fw);
|
||||||
|
four1(&Fw[-1].imag,PE_FFT_SIZE,1);
|
||||||
|
for(i=0; i<PE_FFT_SIZE; i++)
|
||||||
|
Fw[i].real = Fw[i].real*Fw[i].real + Fw[i].imag*Fw[i].imag;
|
||||||
|
|
||||||
|
dump_sq(nlp->sq);
|
||||||
|
dump_Fw(Fw);
|
||||||
|
|
||||||
|
/* find global peak */
|
||||||
|
|
||||||
|
gmax = 0.0;
|
||||||
|
gmax_bin = PE_FFT_SIZE*DEC/pmax;
|
||||||
|
for(i=PE_FFT_SIZE*DEC/pmax; i<=PE_FFT_SIZE*DEC/pmin; i++) {
|
||||||
|
if (Fw[i].real > gmax) {
|
||||||
|
gmax = Fw[i].real;
|
||||||
|
gmax_bin = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
best_f0 = post_process_sub_multiples(Fw, pmin, pmax, gmax, gmax_bin,
|
||||||
|
prev_Wo);
|
||||||
|
|
||||||
|
/* Shift samples in buffer to make room for new samples */
|
||||||
|
|
||||||
|
for(i=0; i<m-n; i++)
|
||||||
|
nlp->sq[i] = nlp->sq[i+n];
|
||||||
|
|
||||||
|
/* return pitch and F0 estimate */
|
||||||
|
|
||||||
|
*pitch = (float)SAMPLE_RATE/best_f0;
|
||||||
|
return(best_f0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
post_process_sub_multiples()
|
||||||
|
|
||||||
|
Given the global maximma of Fw[] we search interger submultiples for
|
||||||
|
local maxima. If local maxima exist and they are above an
|
||||||
|
experimentally derived threshold (OK a magic number I pulled out of
|
||||||
|
the air) we choose the submultiple as the F0 estimate.
|
||||||
|
|
||||||
|
The rational for this is that the lowest frequency peak of Fw[]
|
||||||
|
should be F0, as Fw[] can be considered the autocorrelation function
|
||||||
|
of Sw[] (the speech spectrum). However sometimes due to phase
|
||||||
|
effects the lowest frequency maxima may not be the global maxima.
|
||||||
|
|
||||||
|
This works OK in practice and favours low F0 values in the presence
|
||||||
|
of background noise which means the sinusoidal codec does an OK job
|
||||||
|
of synthesising the background noise. High F0 in background noise
|
||||||
|
tends to sound more periodic introducing annoying artifacts.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
float post_process_sub_multiples(COMP Fw[],
|
||||||
|
int pmin, int pmax, float gmax, int gmax_bin,
|
||||||
|
float *prev_Wo)
|
||||||
|
{
|
||||||
|
int min_bin, cmax_bin;
|
||||||
|
int mult;
|
||||||
|
float thresh, best_f0;
|
||||||
|
int b, bmin, bmax, lmax_bin;
|
||||||
|
float lmax, cmax;
|
||||||
|
int prev_f0_bin;
|
||||||
|
|
||||||
|
/* post process estimate by searching submultiples */
|
||||||
|
|
||||||
|
mult = 2;
|
||||||
|
min_bin = PE_FFT_SIZE*DEC/pmax;
|
||||||
|
cmax_bin = gmax_bin;
|
||||||
|
prev_f0_bin = *prev_Wo*(4000.0/PI)*(PE_FFT_SIZE*DEC)/SAMPLE_RATE;
|
||||||
|
|
||||||
|
while(gmax_bin/mult >= min_bin) {
|
||||||
|
|
||||||
|
b = gmax_bin/mult; /* determine search interval */
|
||||||
|
bmin = 0.8*b;
|
||||||
|
bmax = 1.2*b;
|
||||||
|
if (bmin < min_bin)
|
||||||
|
bmin = min_bin;
|
||||||
|
|
||||||
|
/* lower threshold to favour previous frames pitch estimate,
|
||||||
|
this is a form of pitch tracking */
|
||||||
|
|
||||||
|
if ((prev_f0_bin > bmin) && (prev_f0_bin < bmax))
|
||||||
|
thresh = CNLP*0.5*gmax;
|
||||||
|
else
|
||||||
|
thresh = CNLP*gmax;
|
||||||
|
|
||||||
|
lmax = 0;
|
||||||
|
lmax_bin = bmin;
|
||||||
|
for (b=bmin; b<=bmax; b++) /* look for maximum in interval */
|
||||||
|
if (Fw[b].real > lmax) {
|
||||||
|
lmax = Fw[b].real;
|
||||||
|
lmax_bin = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lmax > thresh)
|
||||||
|
if ((lmax > Fw[lmax_bin-1].real) && (lmax > Fw[lmax_bin+1].real)) {
|
||||||
|
cmax = lmax;
|
||||||
|
cmax_bin = lmax_bin;
|
||||||
|
}
|
||||||
|
|
||||||
|
mult++;
|
||||||
|
}
|
||||||
|
|
||||||
|
best_f0 = (float)cmax_bin*SAMPLE_RATE/(PE_FFT_SIZE*DEC);
|
||||||
|
|
||||||
|
return best_f0;
|
||||||
|
}
|
||||||
|
|
38
libs/libcodec2/src/nlp.h
Normal file
38
libs/libcodec2/src/nlp.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: nlp.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 23/3/93
|
||||||
|
|
||||||
|
Non Linear Pitch (NLP) estimation functions.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __NLP__
|
||||||
|
#define __NLP__
|
||||||
|
|
||||||
|
void *nlp_create();
|
||||||
|
void nlp_destroy(void *nlp_state);
|
||||||
|
float nlp(void *nlp_state, float Sn[], int n, int m, int pmin, int pmax,
|
||||||
|
float *pitch, COMP Sw[], float *prev_Wo);
|
||||||
|
float test_candidate_mbe(COMP Sw[], float f0, COMP Sw_[]);
|
||||||
|
|
||||||
|
#endif
|
104
libs/libcodec2/src/pack.c
Normal file
104
libs/libcodec2/src/pack.c
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2010 Perens LLC <bruce@perens.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include "defines.h"
|
||||||
|
#include "quantise.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Compile-time constants */
|
||||||
|
/* Size of unsigned char in bits. Assumes 8 bits-per-char. */
|
||||||
|
static const unsigned int WordSize = 8;
|
||||||
|
|
||||||
|
/* Mask to pick the bit component out of bitIndex. */
|
||||||
|
static const unsigned int IndexMask = 0x7;
|
||||||
|
|
||||||
|
/* Used to pick the word component out of bitIndex. */
|
||||||
|
static const unsigned int ShiftRight = 3;
|
||||||
|
|
||||||
|
/** Pack a bit field into a bit string, encoding the field in Gray code.
|
||||||
|
*
|
||||||
|
* The output is an array of unsigned char data. The fields are efficiently
|
||||||
|
* packed into the bit string. The Gray coding is a naive attempt to reduce
|
||||||
|
* the effect of single-bit errors, we expect to do a better job as the
|
||||||
|
* codec develops.
|
||||||
|
*
|
||||||
|
* This code would be simpler if it just set one bit at a time in the string,
|
||||||
|
* but would hit the same cache line more often. I'm not sure the complexity
|
||||||
|
* gains us anything here.
|
||||||
|
*
|
||||||
|
* Although field is currently of int type rather than unsigned for
|
||||||
|
* compatibility with the rest of the code, indices are always expected to
|
||||||
|
* be >= 0.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
pack(
|
||||||
|
unsigned char * bitArray, /* The output bit string. */
|
||||||
|
unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/
|
||||||
|
int field, /* The bit field to be packed. */
|
||||||
|
unsigned int fieldWidth/* Width of the field in BITS, not bytes. */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
/* Convert the field to Gray code */
|
||||||
|
field = (field >> 1) ^ field;
|
||||||
|
|
||||||
|
do {
|
||||||
|
unsigned int bI = *bitIndex;
|
||||||
|
unsigned int bitsLeft = WordSize - (bI & IndexMask);
|
||||||
|
unsigned int sliceWidth =
|
||||||
|
bitsLeft < fieldWidth ? bitsLeft : fieldWidth;
|
||||||
|
unsigned int wordIndex = bI >> ShiftRight;
|
||||||
|
|
||||||
|
bitArray[wordIndex] |=
|
||||||
|
((unsigned char)((field >> (fieldWidth - sliceWidth))
|
||||||
|
<< (bitsLeft - sliceWidth)));
|
||||||
|
|
||||||
|
*bitIndex = bI + sliceWidth;
|
||||||
|
fieldWidth -= sliceWidth;
|
||||||
|
} while ( fieldWidth != 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Unpack a field from a bit string, converting from Gray code to binary.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
unpack(
|
||||||
|
const unsigned char * bitArray, /* The input bit string. */
|
||||||
|
unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/
|
||||||
|
unsigned int fieldWidth/* Width of the field in BITS, not bytes. */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
unsigned int field = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
unsigned int bI = *bitIndex;
|
||||||
|
unsigned int bitsLeft = WordSize - (bI & IndexMask);
|
||||||
|
unsigned int sliceWidth =
|
||||||
|
bitsLeft < fieldWidth ? bitsLeft : fieldWidth;
|
||||||
|
|
||||||
|
field |= (((bitArray[bI >> ShiftRight] >> (bitsLeft - sliceWidth)) & ((1 << sliceWidth) - 1)) << (fieldWidth - sliceWidth));
|
||||||
|
|
||||||
|
*bitIndex = bI + sliceWidth;
|
||||||
|
fieldWidth -= sliceWidth;
|
||||||
|
} while ( fieldWidth != 0 );
|
||||||
|
|
||||||
|
/* Convert from Gray code to binary. Works for maximum 8-bit fields. */
|
||||||
|
unsigned int t = field ^ (field >> 8);
|
||||||
|
t ^= (t >> 4);
|
||||||
|
t ^= (t >> 2);
|
||||||
|
t ^= (t >> 1);
|
||||||
|
return t;
|
||||||
|
}
|
254
libs/libcodec2/src/phase.c
Normal file
254
libs/libcodec2/src/phase.c
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: phase.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 1/2/09
|
||||||
|
|
||||||
|
Functions for modelling and synthesising phase.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "phase.h"
|
||||||
|
#include "four1.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define VTHRESH 4.0
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
aks_to_H()
|
||||||
|
|
||||||
|
Samples the complex LPC synthesis filter spectrum at the harmonic
|
||||||
|
frequencies.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void aks_to_H(
|
||||||
|
MODEL *model, /* model parameters */
|
||||||
|
float aks[], /* LPC's */
|
||||||
|
float G, /* energy term */
|
||||||
|
COMP H[], /* complex LPC spectral samples */
|
||||||
|
int order
|
||||||
|
)
|
||||||
|
{
|
||||||
|
COMP Pw[FFT_DEC]; /* power spectrum */
|
||||||
|
int i,m; /* loop variables */
|
||||||
|
int am,bm; /* limits of current band */
|
||||||
|
float r; /* no. rads/bin */
|
||||||
|
float Em; /* energy in band */
|
||||||
|
float Am; /* spectral amplitude sample */
|
||||||
|
int b; /* centre bin of harmonic */
|
||||||
|
float phi_; /* phase of LPC spectra */
|
||||||
|
|
||||||
|
r = TWO_PI/(FFT_DEC);
|
||||||
|
|
||||||
|
/* Determine DFT of A(exp(jw)) ------------------------------------------*/
|
||||||
|
|
||||||
|
for(i=0; i<FFT_DEC; i++) {
|
||||||
|
Pw[i].real = 0.0;
|
||||||
|
Pw[i].imag = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<=order; i++)
|
||||||
|
Pw[i].real = aks[i];
|
||||||
|
|
||||||
|
four1(&Pw[-1].imag,FFT_DEC,-1);
|
||||||
|
|
||||||
|
/* Sample magnitude and phase at harmonics */
|
||||||
|
|
||||||
|
for(m=1; m<=model->L; m++) {
|
||||||
|
am = floor((m - 0.5)*model->Wo/r + 0.5);
|
||||||
|
bm = floor((m + 0.5)*model->Wo/r + 0.5);
|
||||||
|
b = floor(m*model->Wo/r + 0.5);
|
||||||
|
|
||||||
|
Em = 0.0;
|
||||||
|
for(i=am; i<bm; i++)
|
||||||
|
Em += G/(Pw[i].real*Pw[i].real + Pw[i].imag*Pw[i].imag);
|
||||||
|
Am = sqrt(fabs(Em/(bm-am)));
|
||||||
|
|
||||||
|
phi_ = -atan2(Pw[b].imag,Pw[b].real);
|
||||||
|
H[m].real = Am*cos(phi_);
|
||||||
|
H[m].imag = Am*sin(phi_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
phase_synth_zero_order()
|
||||||
|
|
||||||
|
Synthesises phases based on SNR and a rule based approach. No phase
|
||||||
|
parameters are required apart from the SNR (which can be reduced to a
|
||||||
|
1 bit V/UV decision per frame).
|
||||||
|
|
||||||
|
The phase of each harmonic is modelled as the phase of a LPC
|
||||||
|
synthesis filter excited by an impulse. Unlike the first order
|
||||||
|
model the position of the impulse is not transmitted, so we create
|
||||||
|
an excitation pulse train using a rule based approach.
|
||||||
|
|
||||||
|
Consider a pulse train with a pulse starting time n=0, with pulses
|
||||||
|
repeated at a rate of Wo, the fundamental frequency. A pulse train
|
||||||
|
in the time domain is equivalent to harmonics in the frequency
|
||||||
|
domain. We can make an excitation pulse train using a sum of
|
||||||
|
sinsusoids:
|
||||||
|
|
||||||
|
for(m=1; m<=L; m++)
|
||||||
|
ex[n] = cos(m*Wo*n)
|
||||||
|
|
||||||
|
Note: the Octave script ../octave/phase.m is an example of this if
|
||||||
|
you would like to try making a pulse train.
|
||||||
|
|
||||||
|
The phase of each excitation harmonic is:
|
||||||
|
|
||||||
|
arg(E[m]) = mWo
|
||||||
|
|
||||||
|
where E[m] are the complex excitation (freq domain) samples,
|
||||||
|
arg(x), just returns the phase of a complex sample x.
|
||||||
|
|
||||||
|
As we don't transmit the pulse position for this model, we need to
|
||||||
|
synthesise it. Now the excitation pulses occur at a rate of Wo.
|
||||||
|
This means the phase of the first harmonic advances by N samples
|
||||||
|
over a synthesis frame of N samples. For example if Wo is pi/20
|
||||||
|
(200 Hz), then over a 10ms frame (N=80 samples), the phase of the
|
||||||
|
first harmonic would advance (pi/20)*80 = 4*pi or two complete
|
||||||
|
cycles.
|
||||||
|
|
||||||
|
We generate the excitation phase of the fundamental (first
|
||||||
|
harmonic):
|
||||||
|
|
||||||
|
arg[E[1]] = Wo*N;
|
||||||
|
|
||||||
|
We then relate the phase of the m-th excitation harmonic to the
|
||||||
|
phase of the fundamental as:
|
||||||
|
|
||||||
|
arg(E[m]) = m*arg(E[1])
|
||||||
|
|
||||||
|
This E[m] then gets passed through the LPC synthesis filter to
|
||||||
|
determine the final harmonic phase.
|
||||||
|
|
||||||
|
For a while there were prolems with low pitched males like hts1
|
||||||
|
sounding "clicky". The synthesied time domain waveform also looked
|
||||||
|
clicky. Many methods were tried to improve the sounds quality of
|
||||||
|
low pitched males. Finally adding a small amount of jitter to each
|
||||||
|
harmonic worked.
|
||||||
|
|
||||||
|
The current result sounds very close to the original phases, with
|
||||||
|
only 1 voicing bit per frame. For example hts1a using original
|
||||||
|
amplitudes and this phase model produces speech hard to distinguish
|
||||||
|
from speech synthesise with the orginal phases. The sound quality
|
||||||
|
of this patrtiallyuantised codec (nb original amplitudes) is higher
|
||||||
|
than g729, even though all the phase information has been
|
||||||
|
discarded.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
|
||||||
|
1/ This synthesis model is effectvely the same as simple LPC-10
|
||||||
|
vocoders, and yet sounds much better. Why?
|
||||||
|
|
||||||
|
2/ I am pretty sure the Lincoln Lab sinusoidal coding guys (like xMBE
|
||||||
|
also from MIT) first described this zero phase model, I need to look
|
||||||
|
up the paper.
|
||||||
|
|
||||||
|
3/ Note that this approach could cause some discontinuities in
|
||||||
|
the phase at the edge of synthesis frames, as no attempt is made
|
||||||
|
to make sure that the phase tracks are continuous (the excitation
|
||||||
|
phases are continuous, but not the final phases after filtering
|
||||||
|
by the LPC spectra). Technically this is a bad thing. However
|
||||||
|
this may actually be a good thing, disturbing the phase tracks a
|
||||||
|
bit. More research needed, e.g. test a synthesis model that adds
|
||||||
|
a small delta-W to make phase tracks line up for voiced
|
||||||
|
harmonics.
|
||||||
|
|
||||||
|
4/ Why does this sound so great with 1 V/UV decision? Conventional
|
||||||
|
wisdom says mixed voicing is required for high qaulity speech.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void phase_synth_zero_order(
|
||||||
|
MODEL *model,
|
||||||
|
float aks[],
|
||||||
|
float *ex_phase /* excitation phase of fundamental */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int m;
|
||||||
|
float new_phi;
|
||||||
|
COMP Ex[MAX_AMP]; /* excitation samples */
|
||||||
|
COMP A_[MAX_AMP]; /* synthesised harmonic samples */
|
||||||
|
COMP H[MAX_AMP]; /* LPC freq domain samples */
|
||||||
|
float G;
|
||||||
|
float jitter;
|
||||||
|
|
||||||
|
G = 1.0;
|
||||||
|
aks_to_H(model,aks,G,H,LPC_ORD);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Update excitation fundamental phase track, this sets the position
|
||||||
|
of each pitch pulse during voiced speech. After much experiment
|
||||||
|
I found that using just this frame Wo improved quality for UV
|
||||||
|
sounds compared to interpolating two frames Wo like this:
|
||||||
|
|
||||||
|
ex_phase[0] += (*prev_Wo+mode->Wo)*N/2;
|
||||||
|
*/
|
||||||
|
|
||||||
|
ex_phase[0] += (model->Wo)*N;
|
||||||
|
ex_phase[0] -= TWO_PI*floor(ex_phase[0]/TWO_PI + 0.5);
|
||||||
|
|
||||||
|
for(m=1; m<=model->L; m++) {
|
||||||
|
|
||||||
|
/* generate excitation */
|
||||||
|
|
||||||
|
if (model->voiced) {
|
||||||
|
/* This method of adding jitter really helped remove the clicky
|
||||||
|
sound in low pitched makes like hts1a. This moves the onset
|
||||||
|
of each harmonic over at +/- 0.25 of a sample.
|
||||||
|
*/
|
||||||
|
jitter = 0.25*(1.0 - 2.0*rand()/RAND_MAX);
|
||||||
|
Ex[m].real = cos(ex_phase[0]*m - jitter*model->Wo*m);
|
||||||
|
Ex[m].imag = sin(ex_phase[0]*m - jitter*model->Wo*m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* When a few samples were tested I found that LPC filter
|
||||||
|
phase is not needed in the unvoiced case, but no harm in
|
||||||
|
keeping it.
|
||||||
|
*/
|
||||||
|
float phi = TWO_PI*(float)rand()/RAND_MAX;
|
||||||
|
Ex[m].real = cos(phi);
|
||||||
|
Ex[m].imag = sin(phi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* filter using LPC filter */
|
||||||
|
|
||||||
|
A_[m].real = H[m].real*Ex[m].real - H[m].imag*Ex[m].imag;
|
||||||
|
A_[m].imag = H[m].imag*Ex[m].real + H[m].real*Ex[m].imag;
|
||||||
|
|
||||||
|
/* modify sinusoidal phase */
|
||||||
|
|
||||||
|
new_phi = atan2(A_[m].imag, A_[m].real+1E-12);
|
||||||
|
model->phi[m] = new_phi;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
34
libs/libcodec2/src/phase.h
Normal file
34
libs/libcodec2/src/phase.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: phase.h
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 1/2/09
|
||||||
|
|
||||||
|
Functions for modelling phase.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PHASE__
|
||||||
|
#define __PHASE__
|
||||||
|
|
||||||
|
void phase_synth_zero_order(MODEL *model, float aks[], float *ex_phase);
|
||||||
|
|
||||||
|
#endif
|
131
libs/libcodec2/src/postfilter.c
Normal file
131
libs/libcodec2/src/postfilter.c
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
FILE........: postfilter.c
|
||||||
|
AUTHOR......: David Rowe
|
||||||
|
DATE CREATED: 13/09/09
|
||||||
|
|
||||||
|
Postfilter to improve sound quality for speech with high levels of
|
||||||
|
background noise. Unlike mixed-excitation models requires no bits
|
||||||
|
to be transmitted to handle background noise.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 David Rowe
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
||||||
|
published by the Free Software Foundation. This program is
|
||||||
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "dump.h"
|
||||||
|
#include "postfilter.h"
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
DEFINES
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define BG_THRESH 40.0 /* only consider low levels signals for bg_est */
|
||||||
|
#define BG_BETA 0.1 /* averaging filter constant */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
|
||||||
|
postfilter()
|
||||||
|
|
||||||
|
The post filter is designed to help with speech corrupted by
|
||||||
|
background noise. The zero phase model tends to make speech with
|
||||||
|
background noise sound "clicky". With high levels of background
|
||||||
|
noise the low level inter-formant parts of the spectrum will contain
|
||||||
|
noise rather than speech harmonics, so modelling them as voiced
|
||||||
|
(i.e. a continuous, non-random phase track) is inaccurate.
|
||||||
|
|
||||||
|
Some codecs (like MBE) have a mixed voicing model that breaks the
|
||||||
|
spectrum into voiced and unvoiced regions. Several bits/frame
|
||||||
|
(5-12) are required to transmit the frequency selective voicing
|
||||||
|
information. Mixed excitation also requires accurate voicing
|
||||||
|
estimation (parameter estimators always break occasionally under
|
||||||
|
exceptional condition).
|
||||||
|
|
||||||
|
In our case we use a post filter approach which requires no
|
||||||
|
additional bits to be transmitted. The decoder measures the average
|
||||||
|
level of the background noise during unvoiced frames. If a harmonic
|
||||||
|
is less than this level it is made unvoiced by randomising it's
|
||||||
|
phases.
|
||||||
|
|
||||||
|
This idea is rather experimental. Some potential problems that may
|
||||||
|
happen:
|
||||||
|
|
||||||
|
1/ If someone says "aaaaaaaahhhhhhhhh" will background estimator track
|
||||||
|
up to speech level? This would be a bad thing.
|
||||||
|
|
||||||
|
2/ If background noise suddenly dissapears from the source speech does
|
||||||
|
estimate drop quickly? What is noise suddenly re-appears?
|
||||||
|
|
||||||
|
3/ Background noise with a non-flat sepctrum. Current algorithm just
|
||||||
|
comsiders scpetrum as a whole, but this could be broken up into
|
||||||
|
bands, each with their own estimator.
|
||||||
|
|
||||||
|
4/ Males and females with the same level of background noise. Check
|
||||||
|
performance the same. Changing Wo affects width of each band, may
|
||||||
|
affect bg energy estimates.
|
||||||
|
|
||||||
|
5/ Not sure what happens during long periods of voiced speech
|
||||||
|
e.g. "sshhhhhhh"
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void postfilter(
|
||||||
|
MODEL *model,
|
||||||
|
float *bg_est
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int m, uv;
|
||||||
|
float e;
|
||||||
|
|
||||||
|
/* determine average energy across spectrum */
|
||||||
|
|
||||||
|
e = 0.0;
|
||||||
|
for(m=1; m<=model->L; m++)
|
||||||
|
e += model->A[m]*model->A[m];
|
||||||
|
|
||||||
|
e = 10.0*log10(e/model->L);
|
||||||
|
|
||||||
|
/* If beneath threhold, update bg estimate. The idea
|
||||||
|
of the threshold is to prevent updating during high level
|
||||||
|
speech. */
|
||||||
|
|
||||||
|
if ((e < BG_THRESH) && !model->voiced)
|
||||||
|
*bg_est = *bg_est*(1.0 - BG_BETA) + e*BG_BETA;
|
||||||
|
|
||||||
|
/* now mess with phases during voiced frames to make any harmonics
|
||||||
|
less then our background estimate unvoiced.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uv = 0;
|
||||||
|
if (model->voiced)
|
||||||
|
for(m=1; m<=model->L; m++)
|
||||||
|
if (20.0*log10(model->A[m]) < *bg_est) {
|
||||||
|
model->phi[m] = TWO_PI*(float)rand()/RAND_MAX;
|
||||||
|
uv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
dump_bg(e, *bg_est, 100.0*uv/model->L);
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user