mirror of
https://github.com/mborgerding/kissfft.git
synced 2026-11-01 19:49:07 -05:00
Merge branch 'mborgerding:master' into master
This commit is contained in:
@@ -0,0 +1,35 @@
|
|||||||
|
Valid-License-Identifier: BSD-3-Clause
|
||||||
|
SPDX-URL: https://spdx.org/licenses/BSD-3-Clause.html
|
||||||
|
Usage-Guide:
|
||||||
|
To use the BSD 3-clause "New" or "Revised" License put the following SPDX
|
||||||
|
tag/value pair into a comment according to the placement guidelines in
|
||||||
|
the licensing rules documentation:
|
||||||
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
License-Text:
|
||||||
|
|
||||||
|
Copyright (c) <year> <owner> . All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
|
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
Creative Commons Legal Code
|
||||||
|
|
||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||||
|
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||||
|
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||||
|
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||||
|
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||||
|
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||||
|
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||||
|
HEREUNDER.
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||||
|
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for
|
||||||
|
the purpose of contributing to a commons of creative, cultural and
|
||||||
|
scientific works ("Commons") that the public can reliably and without fear
|
||||||
|
of later claims of infringement build upon, modify, incorporate in other
|
||||||
|
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||||
|
and for any purposes, including without limitation commercial purposes.
|
||||||
|
These owners may contribute to the Commons to promote the ideal of a free
|
||||||
|
culture and the further production of creative, cultural and scientific
|
||||||
|
works, or to gain reputation or greater distribution for their Work in
|
||||||
|
part through the use and efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any
|
||||||
|
expectation of additional consideration or compensation, the person
|
||||||
|
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||||
|
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||||
|
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||||
|
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||||
|
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not
|
||||||
|
limited to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display,
|
||||||
|
communicate, and translate a Work;
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or
|
||||||
|
likeness depicted in a Work;
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||||
|
in a Work;
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation
|
||||||
|
thereof, including any amended or successor version of such
|
||||||
|
directive); and
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the
|
||||||
|
world based on applicable law or treaty, and any national
|
||||||
|
implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||||
|
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||||
|
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||||
|
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||||
|
of action, whether now known or unknown (including existing as well as
|
||||||
|
future claims and causes of action), in the Work (i) in all territories
|
||||||
|
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||||
|
treaty (including future time extensions), (iii) in any current or future
|
||||||
|
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||||
|
including without limitation commercial, advertising or promotional
|
||||||
|
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||||
|
member of the public at large and to the detriment of Affirmer's heirs and
|
||||||
|
successors, fully intending that such Waiver shall not be subject to
|
||||||
|
revocation, rescission, cancellation, termination, or any other legal or
|
||||||
|
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||||
|
as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||||
|
be judged legally invalid or ineffective under applicable law, then the
|
||||||
|
Waiver shall be preserved to the maximum extent permitted taking into
|
||||||
|
account Affirmer's express Statement of Purpose. In addition, to the
|
||||||
|
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||||
|
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||||
|
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||||
|
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||||
|
maximum duration provided by applicable law or treaty (including future
|
||||||
|
time extensions), (iii) in any current or future medium and for any number
|
||||||
|
of copies, and (iv) for any purpose whatsoever, including without
|
||||||
|
limitation commercial, advertising or promotional purposes (the
|
||||||
|
"License"). The License shall be deemed effective as of the date CC0 was
|
||||||
|
applied by Affirmer to the Work. Should any part of the License for any
|
||||||
|
reason be judged legally invalid or ineffective under applicable law, such
|
||||||
|
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||||
|
of the License, and in such case Affirmer hereby affirms that he or she
|
||||||
|
will not (i) exercise any of his or her remaining Copyright and Related
|
||||||
|
Rights in the Work or (ii) assert any associated claims and causes of
|
||||||
|
action with respect to the Work, in either case contrary to Affirmer's
|
||||||
|
express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or
|
||||||
|
warranties of any kind concerning the Work, express, implied,
|
||||||
|
statutory or otherwise, including without limitation warranties of
|
||||||
|
title, merchantability, fitness for a particular purpose, non
|
||||||
|
infringement, or the absence of latent or other defects, accuracy, or
|
||||||
|
the present or absence of errors, whether or not discoverable, all to
|
||||||
|
the greatest extent permissible under applicable law.
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without
|
||||||
|
limitation any person's Copyright and Related Rights in the Work.
|
||||||
|
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||||
|
consents, permissions or other rights required for any use of the
|
||||||
|
Work.
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to
|
||||||
|
this CC0 or use of the Work.
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) <year> <copyright holders>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||||
|
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
||||||
|
following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||||
|
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
|
||||||
|
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
Valid-License-Identifier: Unlicense
|
||||||
|
SPDX-URL: https://spdx.org/licenses/Unlicense.html
|
||||||
|
Usage-Guide:
|
||||||
|
To use the Unlicense put the following SPDX tag/value pair into a
|
||||||
|
comment according to the placement guidelines in the licensing rules
|
||||||
|
documentation:
|
||||||
|
SPDX-License-Identifier: Unlicense
|
||||||
|
License-Text:
|
||||||
|
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
|
||||||
|
this software, either in source code form or as a compiled binary, for any
|
||||||
|
purpose, commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
|
software dedicate any and all copyright interest in the software to the public
|
||||||
|
domain. We make this dedication for the benefit of the public at large and
|
||||||
|
to the detriment of our heirs and successors. We intend this dedication to be
|
||||||
|
an overt act of relinquishment in perpetuity of all present and future rights
|
||||||
|
to this software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||||
|
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
|
||||||
|
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
@@ -44,6 +44,29 @@ You can do other cool stuff with the extras you'll find in tools/
|
|||||||
The core fft and most tools/ code can be compiled to use float, double,
|
The core fft and most tools/ code can be compiled to use float, double,
|
||||||
Q15 short or Q31 samples. The default is float.
|
Q15 short or Q31 samples. The default is float.
|
||||||
|
|
||||||
|
### Forward and inverse scaling
|
||||||
|
|
||||||
|
For floating-point builds (`float` or `double`), neither direction is
|
||||||
|
normalized. A forward transform followed by an inverse transform returns
|
||||||
|
`nfft` times the original input. Divide each inverse output sample by
|
||||||
|
`nfft` to recover the input:
|
||||||
|
|
||||||
|
```c
|
||||||
|
/* After kiss_fft(inverse_cfg, spectrum, recovered): */
|
||||||
|
for (int k = 0; k < nfft; ++k) {
|
||||||
|
recovered[k].r /= nfft;
|
||||||
|
recovered[k].i /= nfft;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The same convention applies to `kiss_fft_stride()` and the real transform
|
||||||
|
pair `kiss_fftr()` / `kiss_fftri()`. For the real pair, divide the `nfft`
|
||||||
|
real output samples by the original real transform length, not by the
|
||||||
|
number of complex frequency bins (`nfft / 2 + 1`).
|
||||||
|
|
||||||
|
Fixed-point builds scale internally in both directions to prevent overflow;
|
||||||
|
do not apply the floating-point normalization recipe to them.
|
||||||
|
|
||||||
## BUILDING:
|
## BUILDING:
|
||||||
|
|
||||||
There are two functionally-equivalent build systems supported by kissfft:
|
There are two functionally-equivalent build systems supported by kissfft:
|
||||||
|
|||||||
@@ -411,6 +411,8 @@ void kiss_fft_cleanup(void)
|
|||||||
|
|
||||||
int kiss_fft_next_fast_size(int n)
|
int kiss_fft_next_fast_size(int n)
|
||||||
{
|
{
|
||||||
|
if (n <= 0) /* nothing to factor; avoid infinite loop for n<=0 */
|
||||||
|
return 1;
|
||||||
while(1) {
|
while(1) {
|
||||||
int m=n;
|
int m=n;
|
||||||
while ( (m%2) == 0 ) m/=2;
|
while ( (m%2) == 0 ) m/=2;
|
||||||
|
|||||||
@@ -147,6 +147,10 @@ kiss_fft_cfg KISS_FFT_API kiss_fft_alloc(int nfft,int inverse_fft,void * mem,siz
|
|||||||
* for a forward FFT,
|
* for a forward FFT,
|
||||||
* fin should be f[0] , f[1] , ... ,f[nfft-1]
|
* fin should be f[0] , f[1] , ... ,f[nfft-1]
|
||||||
* fout will be F[0] , F[1] , ... ,F[nfft-1]
|
* fout will be F[0] , F[1] , ... ,F[nfft-1]
|
||||||
|
* Floating-point transforms are unnormalized in both directions: a forward
|
||||||
|
* transform followed by an inverse yields nfft times the original input.
|
||||||
|
* Divide the inverse output by nfft to recover the input. Fixed-point builds
|
||||||
|
* instead scale internally in both directions to prevent overflow.
|
||||||
* Note that each element is complex and can be accessed like
|
* Note that each element is complex and can be accessed like
|
||||||
f[k].r and f[k].i
|
f[k].r and f[k].i
|
||||||
* */
|
* */
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ void KISS_FFT_API kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss
|
|||||||
/*
|
/*
|
||||||
input freqdata has nfft/2+1 complex points
|
input freqdata has nfft/2+1 complex points
|
||||||
output timedata has nfft scalar points
|
output timedata has nfft scalar points
|
||||||
|
For floating-point builds, a kiss_fftr / kiss_fftri round trip returns
|
||||||
|
nfft times the input; divide timedata by nfft to recover the input.
|
||||||
|
Fixed-point builds scale internally and use a different convention.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define kiss_fftr_free KISS_FFT_FREE
|
#define kiss_fftr_free KISS_FFT_FREE
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ target_compile_definitions(tkfc PRIVATE KFC_TEST)
|
|||||||
add_kissfft_test_executable(ffr twotonetest.c)
|
add_kissfft_test_executable(ffr twotonetest.c)
|
||||||
add_kissfft_test_executable(tr test_real.c)
|
add_kissfft_test_executable(tr test_real.c)
|
||||||
|
|
||||||
|
add_kissfft_test_executable(next_fast_size next_fast_size.c)
|
||||||
|
|
||||||
add_kissfft_test_executable(testcpp testcpp.cc)
|
add_kissfft_test_executable(testcpp testcpp.cc)
|
||||||
|
|
||||||
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
if(KISSFFT_DATATYPE MATCHES "^simd$")
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003-2010, Mark Borgerding. All rights reserved.
|
||||||
|
* This file is part of KISS FFT - https://github.com/mborgerding/kissfft
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* See COPYING file for more information.
|
||||||
|
*
|
||||||
|
* Regression test for github issue #121: kiss_fft_next_fast_size(0)
|
||||||
|
* used to hang forever in the factorization loop.
|
||||||
|
*/
|
||||||
|
#include "kiss_fft.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
/* n<=0 must return 1 per maintainer decision, not hang */
|
||||||
|
if (kiss_fft_next_fast_size(0) != 1) {
|
||||||
|
fprintf(stderr, "FAIL: kiss_fft_next_fast_size(0) != 1\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (kiss_fft_next_fast_size(-3) != 1) {
|
||||||
|
fprintf(stderr, "FAIL: kiss_fft_next_fast_size(-3) != 1\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* positive inputs keep their pre-fix behavior */
|
||||||
|
{
|
||||||
|
int expected[9] = { 0, 1, 2, 3, 4, 5, 6, 8, 8 };
|
||||||
|
for (n = 1; n <= 8; ++n) {
|
||||||
|
if (kiss_fft_next_fast_size(n) != expected[n]) {
|
||||||
|
fprintf(stderr, "FAIL: kiss_fft_next_fast_size(%d) = %d, expected %d\n",
|
||||||
|
n, kiss_fft_next_fast_size(n), expected[n]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("kiss_fft_next_fast_size: all checks passed\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user