kopia lustrzana https://github.com/Dsplib/libdspl-2.0
initial commit
rodzic
7c9e335cba
commit
4d90b08e7b
|
@ -0,0 +1,3 @@
|
|||
*.o
|
||||
*.so
|
||||
*.dll
|
|
@ -0,0 +1,165 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
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 that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU 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 as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
|
||||
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
MAKE = mingw32-make
|
||||
else
|
||||
UNAME_S := $(shell uname -s)
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
MAKE = make
|
||||
endif
|
||||
endif
|
||||
|
||||
include Makefile.dirs
|
||||
|
||||
|
||||
|
||||
|
||||
all:
|
||||
$(MAKE) -f Makefile.dspl
|
||||
cp -r include/dspl.h release/include/dspl.h
|
||||
cp -r include/dspl.c release/include/dspl.c
|
||||
$(MAKE) -f Makefile.test
|
||||
cp -r $(RELEASE_DIR)/$(DSPL_LIBNAME) test/bin/$(DSPL_LIBNAME)
|
||||
|
||||
|
||||
|
||||
|
||||
clean:
|
||||
$(MAKE) -f Makefile.dspl clean
|
||||
$(MAKE) -f Makefile.test clean
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
CC = gcc
|
||||
INC_DIR = include
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
DSPL_LIBNAME = libdspl.dll
|
||||
DEF_OS = WIN_OS
|
||||
LFLAGS = -lm
|
||||
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
|
||||
RELEASE_DIR = release/lib/win64
|
||||
EXTLIB_DIR = ext/win64
|
||||
else
|
||||
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
|
||||
RELEASE_DIR = release/lib/win64
|
||||
EXTLIB_DIR = ext/win64
|
||||
endif
|
||||
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
|
||||
RELEASE_DIR = release/lib/win32
|
||||
EXTLIB_DIR = ext/win32
|
||||
endif
|
||||
endif
|
||||
else
|
||||
UNAME_S := $(shell uname -s)
|
||||
UNAME_P := $(shell uname -p)
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
DSPL_LIBNAME = libdspl.so
|
||||
DEF_OS = LINUX_OS
|
||||
LFLAGS = -lm -ldl
|
||||
ifeq ($(UNAME_P),x86_64)
|
||||
RELEASE_DIR = release/lib/linux64
|
||||
EXTLIB_DIR = ext/linux64
|
||||
endif
|
||||
ifneq ($(filter %86,$(UNAME_P)),)
|
||||
RELEASE_DIR = release/lib/linux32
|
||||
EXTLIB_DIR = ext/linux32
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
LIB_DIR = dspl
|
||||
|
||||
include Makefile.dirs
|
||||
|
||||
|
||||
SRC_DIR = $(LIB_DIR)/src
|
||||
OBJ_DIR = $(LIB_DIR)/obj
|
||||
|
||||
COMMON_SRC_DIR = $(COMMON_DIR)/src
|
||||
|
||||
|
||||
LIB_NAME = $(DSPL_LIBNAME)
|
||||
|
||||
CFLAGS = -c -fPIC -Wall -O3 -I$(INC_DIR) -DBUILD_LIB -D$(DEF_OS)
|
||||
|
||||
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
|
||||
OBJ_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(SRC_FILES:.c=.o)))
|
||||
|
||||
|
||||
all: $(RELEASE_DIR)/$(LIB_NAME)
|
||||
|
||||
|
||||
$(RELEASE_DIR)/$(LIB_NAME): $(OBJ_FILES)
|
||||
$(CC) -shared -o $(RELEASE_DIR)/$(LIB_NAME) $(OBJ_FILES) -L$(EXTLIB_DIR) -lfftw3 -lblas -lm
|
||||
|
||||
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c
|
||||
$(CC) $(CFLAGS) $< -o $@ -L$(EXTLIB_DIR) -lfftw3 -lblas -llapack -lgfortran -lm
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ_DIR)/*.o
|
||||
rm -f $(RELEASE_DIR)/$(LIB_NAME)
|
|
@ -0,0 +1,29 @@
|
|||
PRJ_DIR = test
|
||||
|
||||
SRC_DIR = $(PRJ_DIR)/src
|
||||
BIN_DIR = $(PRJ_DIR)/bin
|
||||
|
||||
include Makefile.dirs
|
||||
|
||||
DSPL_C_FILE = $(INC_DIR)/dspl.c
|
||||
DSPL_O_FILE = $(PRJ_DIR)/obj/dspl.o
|
||||
|
||||
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
|
||||
BIN_FILES = $(addprefix $(BIN_DIR)/,$(notdir $(SRC_FILES:.c=.exe)))
|
||||
|
||||
|
||||
CFLAGS = -Wall -O3 -I$(INC_DIR) -D$(DEF_OS)
|
||||
|
||||
all: $(BIN_FILES)
|
||||
|
||||
$(BIN_DIR)/%.exe: $(SRC_DIR)/%.c $(DSPL_O_FILE)
|
||||
$(CC) $(CFLAGS) $< $(DSPL_O_FILE) -o $@ $(LFLAGS)
|
||||
|
||||
$(DSPL_O_FILE):$(DSPL_C_FILE)
|
||||
$(CC) -c $(CFLAGS) $(DSPL_C_FILE) -o $(DSPL_O_FILE) $(LFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f $(BIN_DIR)/*.exe
|
||||
rm -f $(BIN_DIR)/$(DSPL_LIBNAME)
|
||||
rm -f $(DSPL_O_FILE)
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2018 Sergey Bakhurin
|
||||
* Digital Signal Processing Library [http://dsplib.org]
|
||||
*
|
||||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
|
||||
void dscal_(int*, double*, double*, int*);
|
||||
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
DSCAL scales a vector by a constant
|
||||
***************************************************************************************************/
|
||||
int DSPL_API blas_dscal(int n, double a, double* x, int incx)
|
||||
{
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(incx < 1)
|
||||
return ERROR_INC_SIZE;
|
||||
|
||||
dscal_(&n, &a, x, &incx);
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2018 Sergey Bakhurin
|
||||
* Digital Signal Processing Library [http://dsplib.org]
|
||||
*
|
||||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
Real vector DFT
|
||||
***************************************************************************************************/
|
||||
int DSPL_API dft(double* x, int n, complex_t *y)
|
||||
{
|
||||
int k;
|
||||
int m;
|
||||
double divn;
|
||||
double phi;
|
||||
|
||||
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
divn = 1.0 / (double)n;
|
||||
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
RE(y[k]) = IM(y[k]) = 0.0;
|
||||
for(m = 0; m < n; m++)
|
||||
{
|
||||
phi = -M_2PI * divn * (double)k * (double)m;
|
||||
RE(y[k]) += x[m] * cos(phi);
|
||||
IM(y[k]) += x[m] * sin(phi);
|
||||
}
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
Complex vector DFT
|
||||
***************************************************************************************************/
|
||||
int DSPL_API dft_cmplx(complex_t* x, int n, complex_t *y)
|
||||
{
|
||||
int k;
|
||||
int m;
|
||||
double divn;
|
||||
double phi;
|
||||
complex_t e;
|
||||
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
divn = 1.0 / (double)n;
|
||||
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
RE(y[k]) = IM(y[k]) = 0.0;
|
||||
for(m = 0; m < n; m++)
|
||||
{
|
||||
phi = -M_2PI * divn * (double)k * (double)m;
|
||||
RE(e) = cos(phi);
|
||||
IM(e) = sin(phi);
|
||||
RE(y[k]) += CMRE(x[m], e);
|
||||
IM(y[k]) += CMIM(x[m], e);
|
||||
}
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2018 Sergey Bakhurin
|
||||
* Digital Signal Processing Library [http://dsplib.org]
|
||||
*
|
||||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "dspl.h"
|
||||
#include "fftw3.h"
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
Create FFT object
|
||||
***************************************************************************************************/
|
||||
int DSPL_API fft_create( fft_t *pfft, int n)
|
||||
{
|
||||
if(!pfft)
|
||||
return ERROR_PTR;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
printf("1\n");
|
||||
if(pfft->in)
|
||||
{
|
||||
if(pfft->size != n)
|
||||
pfft->in = (complex_t*) realloc(pfft->in, n*sizeof(complex_t));
|
||||
}
|
||||
else
|
||||
pfft->in = (complex_t*) malloc(n*sizeof(complex_t));
|
||||
|
||||
if(pfft->out)
|
||||
{
|
||||
if(pfft->size != n)
|
||||
pfft->out = (complex_t*) realloc(pfft->out, n*sizeof(complex_t));
|
||||
}
|
||||
else
|
||||
pfft->out = (complex_t*) malloc(n*sizeof(complex_t));
|
||||
|
||||
pfft->size = n;
|
||||
printf("2\n");
|
||||
|
||||
if(pfft->pfftw)
|
||||
fftw_destroy_plan(pfft->pfftw);
|
||||
|
||||
printf("3\n");
|
||||
pfft->pfftw = (void*)fftw_plan_dft_1d(n, pfft->in, pfft->out, FFTW_FORWARD, FFTW_ESTIMATE);
|
||||
printf("4\n");
|
||||
|
||||
if(!pfft->pfftw)
|
||||
return ERROR_FFT_CREATE;
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
Destroy FFT object
|
||||
***************************************************************************************************/
|
||||
void DSPL_API fft_destroy(fft_t *pfft)
|
||||
{
|
||||
if(pfft)
|
||||
return;
|
||||
|
||||
if(pfft->pfftw)
|
||||
fftw_destroy_plan(pfft->pfftw);
|
||||
|
||||
if(pfft->in)
|
||||
free(pfft->in);
|
||||
|
||||
if(pfft->out)
|
||||
free(pfft->out);
|
||||
|
||||
pfft->size = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
Destroy FFT object
|
||||
***************************************************************************************************/
|
||||
int DSPL_API fft_cmplx(complex_t *x, int n, fft_t* pfft, complex_t* y)
|
||||
{
|
||||
if(!x || !y || !pfft)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
if(n != pfft->size)
|
||||
fft_create(pfft, n);
|
||||
|
||||
memcpy(pfft->in, x, n*sizeof(complex_t));
|
||||
|
||||
fftw_execute(pfft->pfftw);
|
||||
|
||||
memcpy(y, pfft->out, n*sizeof(complex_t));
|
||||
return RES_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
FFT shifting
|
||||
***************************************************************************************************/
|
||||
int DSPL_API fft_shift(double* x, int n, double* y)
|
||||
{
|
||||
int n2, r;
|
||||
int k;
|
||||
double tmp;
|
||||
double *buf;
|
||||
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
r = n%2;
|
||||
if(!r)
|
||||
{
|
||||
n2 = n>>1;
|
||||
for(k = 0; k < n2; k++)
|
||||
{
|
||||
tmp = x[k];
|
||||
y[k] = x[k+n2];
|
||||
y[k+n2] = tmp;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
n2 = (n-1) >> 1;
|
||||
buf = (double*) malloc(n2*sizeof(double));
|
||||
memcpy(buf, x, n2*sizeof(double));
|
||||
memcpy(y, x+n2, (n2+1)*sizeof(double));
|
||||
memcpy(y+n2+1, buf, n2*sizeof(double));
|
||||
free(buf);
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2018 Sergey Bakhurin
|
||||
* Digital Signal Processing Library [http://dsplib.org]
|
||||
*
|
||||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef WIN_OS
|
||||
#include <windows.h>
|
||||
#endif //WIN_OS
|
||||
|
||||
#ifdef LINUX_OS
|
||||
#include <dlfcn.h>
|
||||
#endif //LINUX_OS
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
#ifndef BUILD_LIB
|
||||
p_blas_dscal blas_dscal ;
|
||||
p_dft dft ;
|
||||
p_dft_cmplx dft_cmplx ;
|
||||
p_fft_create fft_create ;
|
||||
p_fft_destroy fft_destroy ;
|
||||
p_fft_cmplx fft_cmplx ;
|
||||
p_fft_shift fft_shift ;
|
||||
|
||||
|
||||
#endif //BUILD_LIB
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void* dspl_load()
|
||||
{
|
||||
#ifdef WIN_OS
|
||||
HINSTANCE handle;
|
||||
char* fname;
|
||||
handle = LoadLibrary(TEXT("libdspl.dll"));
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.dll loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fname = "dft";
|
||||
dft = (p_dft)GetProcAddress(handle, fname);
|
||||
if(!dft) goto exit_label;
|
||||
|
||||
fname = "dft_cmplx";
|
||||
dft_cmplx = (p_dft_cmplx)GetProcAddress(handle, fname);
|
||||
if(!dft_cmplx) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_create";
|
||||
fft_create = (p_fft_create)GetProcAddress(handle, fname);
|
||||
if(!fft_create) goto exit_label;
|
||||
|
||||
fname = "fft_destroy";
|
||||
fft_destroy = (p_fft_destroy)GetProcAddress(handle, fname);
|
||||
if(!fft_destroy) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_cmplx";
|
||||
fft_cmplx = (p_fft_cmplx)GetProcAddress(handle, fname);
|
||||
if(!fft_cmplx) goto exit_label;
|
||||
|
||||
fname = "fft_shift";
|
||||
fft_shift = (p_fft_shift)GetProcAddress(handle, fname);
|
||||
if(!fft_shift) goto exit_label;
|
||||
|
||||
|
||||
return (void*)handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
FreeLibrary(handle);
|
||||
return NULL;
|
||||
#endif //WIN_OS
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
char* error;
|
||||
void *handle;
|
||||
char* fname;
|
||||
|
||||
// open the *.so
|
||||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.so loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
fname = "blas_dscal";
|
||||
blas_dscal = (p_blas_dscal)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
fname = "dft";
|
||||
dft = (p_dft)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "dft_cmplx";
|
||||
dft_cmplx = (p_dft_cmplx)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
fname = "fft_create";
|
||||
fft_create = (p_fft_create)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_destroy";
|
||||
fft_destroy = (p_fft_destroy)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_cmplx";
|
||||
fft_cmplx = (p_fft_cmplx)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_shift";
|
||||
fft_shift = (p_fft_shift)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
return handle;
|
||||
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
#endif //LINUX_OS
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void dspl_free(void* handle)
|
||||
{
|
||||
#ifdef WIN_OS
|
||||
FreeLibrary((HINSTANCE)handle);
|
||||
#endif //WIN_OS
|
||||
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
dlclose(handle);
|
||||
#endif //LINUX_OS
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,194 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2018 Sergey Bakhurin
|
||||
* Digital Signal Processing Library [http://dsplib.org]
|
||||
*
|
||||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef DSPL_H
|
||||
#define DSPL_H
|
||||
|
||||
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
/* math const definition */
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.1415926535897932384626433832795
|
||||
#endif
|
||||
#ifndef M_2PI
|
||||
#define M_2PI 6.283185307179586476925286766559
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
typedef double complex_t[2];
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void *pfftw;
|
||||
complex_t *in;
|
||||
complex_t *out;
|
||||
size_t size;
|
||||
} fft_t;
|
||||
|
||||
|
||||
#define RE(x) (x[0])
|
||||
#define IM(x) (x[1])
|
||||
|
||||
|
||||
#define SQR(x) ((x) * (x))
|
||||
#define ABSSQR(x) ((SQR(RE(x))) + (SQR(IM(x))))
|
||||
#define ABS(x) sqrt((ABSSQR(x)))
|
||||
|
||||
#define CMRE(a,b) ((RE(a)) * (RE(b)) - (IM(a)) * (IM(b)))
|
||||
#define CMIM(a,b) ((RE(a)) * (IM(b)) + (IM(a)) * (RE(b)))
|
||||
|
||||
#define CMCONJRE(a, b) ((RE(a)) * (RE(b)) + (IM(a)) * (IM(b)))
|
||||
#define CMCONJIM(a, b) ((IM(a)) * (RE(b)) - (RE(a)) * (IM(b)))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define RES_OK 0
|
||||
|
||||
/* Error codes */
|
||||
/* A 0x01xxxxxx*/
|
||||
/* B 0x02xxxxxx*/
|
||||
/* C 0x03xxxxxx*/
|
||||
/* D 0x04xxxxxx*/
|
||||
#define ERROR_DAT_TYPE 0x04012020
|
||||
#define ERROR_DIV_ZERO 0x04102226
|
||||
/* E 0x05xxxxxx*/
|
||||
#define ERROR_ELLIP_MODULE 0x05121315
|
||||
/* F 0x06xxxxxx*/
|
||||
#define ERROR_FFT_CREATE 0x06060318
|
||||
#define ERROR_FILTER_A0 0x06100100
|
||||
#define ERROR_FILTER_ORD 0x06101518
|
||||
#define ERROR_FILTER_RP 0x06101816
|
||||
#define ERROR_FILTER_RS 0x06101819
|
||||
#define ERROR_FNAME 0x06140113
|
||||
#define ERROR_FOPEN 0x06151605
|
||||
#define ERROR_FWRITE_SIZE 0x06231820
|
||||
/* G 0x07xxxxxx*/
|
||||
/* H 0x08xxxxxx*/
|
||||
/* I 0x09xxxxxx*/
|
||||
#define ERROR_INC_SIZE 0x09140319
|
||||
/* J 0x10xxxxxx*/
|
||||
/* K 0x11xxxxxx*/
|
||||
/* L 0x12xxxxxx*/
|
||||
/* M 0x13xxxxxx*/
|
||||
/* N 0x14xxxxxx*/
|
||||
#define ERROR_NEGATIVE 0x14050701
|
||||
/* O 0x15xxxxxx*/
|
||||
/* P 0x16xxxxxx*/
|
||||
#define ERROR_POLY_ORD 0x16151518
|
||||
#define ERROR_PTR 0x16201800
|
||||
/* Q 0x17xxxxxx*/
|
||||
/* R 0x18xxxxxx*/
|
||||
#define ERROR_RAND_SIGMA 0x18011909
|
||||
#define ERROR_RESAMPLE_RATIO 0x18051801
|
||||
#define ERROR_RESAMPLE_FRAC_DELAY 0x18050604
|
||||
/* S 0x19xxxxxx*/
|
||||
#define ERROR_SIZE 0x19092605
|
||||
#define ERROR_SYM_TYPE 0x19251320
|
||||
/* T 0x20xxxxxx*/
|
||||
/* U 0x21xxxxxx*/
|
||||
/* V 0x22xxxxxx*/
|
||||
/* W 0x23xxxxxx*/
|
||||
#define ERROR_WIN_TYPE 0x23092025
|
||||
#define ERROR_WIN_SYM 0x23091925
|
||||
/* X 0x24xxxxxx*/
|
||||
/* Y 0x25xxxxxx*/
|
||||
/* Z 0x26xxxxxx*/
|
||||
|
||||
|
||||
#define DAT_DOUBLE 0
|
||||
#define DAT_COMPLEX 1
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// Declare DSPL_API for Windows OS
|
||||
#ifdef BUILD_LIB
|
||||
|
||||
#ifdef WIN_OS
|
||||
#define DSPL_API __declspec(dllexport)
|
||||
#endif // WIN_OS
|
||||
|
||||
#ifdef LINUX_OS
|
||||
#define DSPL_API
|
||||
#endif //LINUX_OS
|
||||
|
||||
|
||||
int DSPL_API blas_dscal(int n, double a, double* x, int incx);
|
||||
|
||||
int DSPL_API dft (double* x, int n, complex_t *y);
|
||||
int DSPL_API dft_cmplx (complex_t* x, int n, complex_t *y);
|
||||
|
||||
|
||||
int DSPL_API fft_create ( fft_t *pfft, int n);
|
||||
void DSPL_API fft_destroy (fft_t *pfft);
|
||||
int DSPL_API fft_cmplx (complex_t *x, int n, fft_t* pfft, complex_t* y);
|
||||
int DSPL_API fft_shift (double* x, int n, double* y);
|
||||
|
||||
|
||||
#else //BUILD_LIB
|
||||
|
||||
|
||||
|
||||
typedef int (*p_blas_dscal ) (int n, double a, double* x, int incx);
|
||||
typedef int (*p_dft ) (double* x, int n, complex_t *y);
|
||||
typedef int (*p_dft_cmplx ) (complex_t* x, int n, complex_t *y);
|
||||
typedef int (*p_fft_create ) (fft_t *pfft, int n);
|
||||
typedef void(*p_fft_destroy ) (fft_t *pfft);
|
||||
typedef int (*p_fft_cmplx ) (complex_t *x, int n, fft_t* pfft, complex_t* y);
|
||||
typedef int (*p_fft_shift ) (double* x, int n, double* y);
|
||||
|
||||
|
||||
|
||||
extern p_blas_dscal blas_dscal ;
|
||||
extern p_dft dft ;
|
||||
extern p_dft_cmplx dft_cmplx ;
|
||||
extern p_fft_create fft_create ;
|
||||
extern p_fft_destroy fft_destroy ;
|
||||
extern p_fft_cmplx fft_cmplx ;
|
||||
extern p_fft_shift fft_shift ;
|
||||
|
||||
#endif //BUILD_DLL
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void* dspl_load();
|
||||
void dspl_free(void* handle);
|
||||
|
||||
|
||||
|
||||
#endif //DSPL_H
|
||||
|
|
@ -0,0 +1,514 @@
|
|||
/*
|
||||
* Copyright (c) 2003, 2007-14 Matteo Frigo
|
||||
* Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
|
||||
*
|
||||
* The following statement of license applies *only* to this header file,
|
||||
* and *not* to the other files distributed with FFTW or derived therefrom:
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||
*/
|
||||
|
||||
/***************************** NOTE TO USERS *********************************
|
||||
*
|
||||
* THIS IS A HEADER FILE, NOT A MANUAL
|
||||
*
|
||||
* If you want to know how to use FFTW, please read the manual,
|
||||
* online at http://www.fftw.org/doc/ and also included with FFTW.
|
||||
* For a quick start, see the manual's tutorial section.
|
||||
*
|
||||
* (Reading header files to learn how to use a library is a habit
|
||||
* stemming from code lacking a proper manual. Arguably, it's a
|
||||
* *bad* habit in most cases, because header files can contain
|
||||
* interfaces that are not part of the public, stable API.)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef FFTW3_H
|
||||
#define FFTW3_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* If <complex.h> is included, use the C99 complex type. Otherwise
|
||||
define a type bit-compatible with C99 complex */
|
||||
#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)
|
||||
# define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C
|
||||
#else
|
||||
# define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2]
|
||||
#endif
|
||||
|
||||
#define FFTW_CONCAT(prefix, name) prefix ## name
|
||||
#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name)
|
||||
#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name)
|
||||
#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name)
|
||||
#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name)
|
||||
|
||||
/* IMPORTANT: for Windows compilers, you should add a line
|
||||
#define FFTW_DLL
|
||||
here and in kernel/ifftw.h if you are compiling/using FFTW as a
|
||||
DLL, in order to do the proper importing/exporting, or
|
||||
alternatively compile with -DFFTW_DLL or the equivalent
|
||||
command-line flag. This is not necessary under MinGW/Cygwin, where
|
||||
libtool does the imports/exports automatically. */
|
||||
#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__))
|
||||
/* annoying Windows syntax for shared-library declarations */
|
||||
# if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */
|
||||
# define FFTW_EXTERN extern __declspec(dllexport)
|
||||
# else /* user is calling FFTW; import symbol */
|
||||
# define FFTW_EXTERN extern __declspec(dllimport)
|
||||
# endif
|
||||
#else
|
||||
# define FFTW_EXTERN extern
|
||||
#endif
|
||||
|
||||
/* specify calling convention (Windows only) */
|
||||
#if defined(_WIN32) || defined(__WIN32__)
|
||||
# define FFTW_CDECL __cdecl
|
||||
#else
|
||||
# define FFTW_CDECL
|
||||
#endif
|
||||
|
||||
enum fftw_r2r_kind_do_not_use_me {
|
||||
FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2,
|
||||
FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6,
|
||||
FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10
|
||||
};
|
||||
|
||||
struct fftw_iodim_do_not_use_me {
|
||||
int n; /* dimension size */
|
||||
int is; /* input stride */
|
||||
int os; /* output stride */
|
||||
};
|
||||
|
||||
#include <stddef.h> /* for ptrdiff_t */
|
||||
struct fftw_iodim64_do_not_use_me {
|
||||
ptrdiff_t n; /* dimension size */
|
||||
ptrdiff_t is; /* input stride */
|
||||
ptrdiff_t os; /* output stride */
|
||||
};
|
||||
|
||||
typedef void (FFTW_CDECL *fftw_write_char_func_do_not_use_me)(char c, void *);
|
||||
typedef int (FFTW_CDECL *fftw_read_char_func_do_not_use_me)(void *);
|
||||
|
||||
/*
|
||||
huge second-order macro that defines prototypes for all API
|
||||
functions. We expand this macro for each supported precision
|
||||
|
||||
X: name-mangling macro
|
||||
R: real data type
|
||||
C: complex data type
|
||||
*/
|
||||
|
||||
#define FFTW_DEFINE_API(X, R, C) \
|
||||
\
|
||||
FFTW_DEFINE_COMPLEX(R, C); \
|
||||
\
|
||||
typedef struct X(plan_s) *X(plan); \
|
||||
\
|
||||
typedef struct fftw_iodim_do_not_use_me X(iodim); \
|
||||
typedef struct fftw_iodim64_do_not_use_me X(iodim64); \
|
||||
\
|
||||
typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \
|
||||
\
|
||||
typedef fftw_write_char_func_do_not_use_me X(write_char_func); \
|
||||
typedef fftw_read_char_func_do_not_use_me X(read_char_func); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute)(const X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft)(int rank, const int *n, \
|
||||
C *in, C *out, int sign, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_1d)(int n, C *in, C *out, int sign, \
|
||||
unsigned flags); \
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_2d)(int n0, int n1, \
|
||||
C *in, C *out, int sign, unsigned flags); \
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_3d)(int n0, int n1, int n2, \
|
||||
C *in, C *out, int sign, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_many_dft)(int rank, const int *n, \
|
||||
int howmany, \
|
||||
C *in, const int *inembed, \
|
||||
int istride, int idist, \
|
||||
C *out, const int *onembed, \
|
||||
int ostride, int odist, \
|
||||
int sign, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_dft)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
C *in, C *out, \
|
||||
int sign, unsigned flags); \
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
R *ri, R *ii, R *ro, R *io, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_dft)(int rank, \
|
||||
const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
C *in, C *out, \
|
||||
int sign, unsigned flags); \
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_split_dft)(int rank, \
|
||||
const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
R *ri, R *ii, R *ro, R *io, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_dft)(const X(plan) p, C *in, C *out); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \
|
||||
R *ro, R *io); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_many_dft_r2c)(int rank, const int *n, \
|
||||
int howmany, \
|
||||
R *in, const int *inembed, \
|
||||
int istride, int idist, \
|
||||
C *out, const int *onembed, \
|
||||
int ostride, int odist, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_r2c)(int rank, const int *n, \
|
||||
R *in, C *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_r2c_2d)(int n0, int n1, \
|
||||
R *in, C *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_r2c_3d)(int n0, int n1, \
|
||||
int n2, \
|
||||
R *in, C *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_many_dft_c2r)(int rank, const int *n, \
|
||||
int howmany, \
|
||||
C *in, const int *inembed, \
|
||||
int istride, int idist, \
|
||||
R *out, const int *onembed, \
|
||||
int ostride, int odist, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_c2r)(int rank, const int *n, \
|
||||
C *in, R *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_c2r_2d)(int n0, int n1, \
|
||||
C *in, R *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_dft_c2r_3d)(int n0, int n1, \
|
||||
int n2, \
|
||||
C *in, R *out, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
R *in, C *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
C *in, R *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_split_dft_r2c)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
R *in, R *ro, R *io, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_split_dft_c2r)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
R *ri, R *ii, R *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_dft_r2c)(int rank, \
|
||||
const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
R *in, C *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_dft_c2r)(int rank, \
|
||||
const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
C *in, R *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_split_dft_r2c)(int rank, const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
R *in, R *ro, R *io, \
|
||||
unsigned flags); \
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_split_dft_c2r)(int rank, const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
R *ri, R *ii, R *out, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_split_dft_r2c)(const X(plan) p, \
|
||||
R *in, R *ro, R *io); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_split_dft_c2r)(const X(plan) p, \
|
||||
R *ri, R *ii, R *out); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_many_r2r)(int rank, const int *n, \
|
||||
int howmany, \
|
||||
R *in, const int *inembed, \
|
||||
int istride, int idist, \
|
||||
R *out, const int *onembed, \
|
||||
int ostride, int odist, \
|
||||
const X(r2r_kind) *kind, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_r2r)(int rank, const int *n, R *in, R *out, \
|
||||
const X(r2r_kind) *kind, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_r2r_1d)(int n, R *in, R *out, \
|
||||
X(r2r_kind) kind, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \
|
||||
X(r2r_kind) kind0, X(r2r_kind) kind1, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_r2r_3d)(int n0, int n1, int n2, \
|
||||
R *in, R *out, X(r2r_kind) kind0, \
|
||||
X(r2r_kind) kind1, X(r2r_kind) kind2, \
|
||||
unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru_r2r)(int rank, const X(iodim) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim) *howmany_dims, \
|
||||
R *in, R *out, \
|
||||
const X(r2r_kind) *kind, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN X(plan) \
|
||||
FFTW_CDECL X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \
|
||||
int howmany_rank, \
|
||||
const X(iodim64) *howmany_dims, \
|
||||
R *in, R *out, \
|
||||
const X(r2r_kind) *kind, unsigned flags); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(execute_r2r)(const X(plan) p, R *in, R *out); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(destroy_plan)(X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(forget_wisdom)(void); \
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(cleanup)(void); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(set_timelimit)(double t); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(plan_with_nthreads)(int nthreads); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(init_threads)(void); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(cleanup_threads)(void); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(make_planner_thread_safe)(void); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(export_wisdom_to_filename)(const char *filename); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(export_wisdom_to_file)(FILE *output_file); \
|
||||
\
|
||||
FFTW_EXTERN char * \
|
||||
FFTW_CDECL X(export_wisdom_to_string)(void); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(export_wisdom)(X(write_char_func) write_char, \
|
||||
void *data); \
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(import_system_wisdom)(void); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(import_wisdom_from_filename)(const char *filename); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(import_wisdom_from_file)(FILE *input_file); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(import_wisdom_from_string)(const char *input_string); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(import_wisdom)(X(read_char_func) read_char, void *data); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(fprint_plan)(const X(plan) p, FILE *output_file); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(print_plan)(const X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN char * \
|
||||
FFTW_CDECL X(sprint_plan)(const X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN void * \
|
||||
FFTW_CDECL X(malloc)(size_t n); \
|
||||
\
|
||||
FFTW_EXTERN R * \
|
||||
FFTW_CDECL X(alloc_real)(size_t n); \
|
||||
FFTW_EXTERN C * \
|
||||
FFTW_CDECL X(alloc_complex)(size_t n); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(free)(void *p); \
|
||||
\
|
||||
FFTW_EXTERN void \
|
||||
FFTW_CDECL X(flops)(const X(plan) p, \
|
||||
double *add, double *mul, double *fmas); \
|
||||
FFTW_EXTERN double \
|
||||
FFTW_CDECL X(estimate_cost)(const X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN double \
|
||||
FFTW_CDECL X(cost)(const X(plan) p); \
|
||||
\
|
||||
FFTW_EXTERN int \
|
||||
FFTW_CDECL X(alignment_of)(R *p); \
|
||||
\
|
||||
FFTW_EXTERN const char X(version)[]; \
|
||||
FFTW_EXTERN const char X(cc)[]; \
|
||||
FFTW_EXTERN const char X(codelet_optim)[];
|
||||
|
||||
|
||||
/* end of FFTW_DEFINE_API macro */
|
||||
|
||||
FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex)
|
||||
FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex)
|
||||
FFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)
|
||||
|
||||
/* __float128 (quad precision) is a gcc extension on i386, x86_64, and ia64
|
||||
for gcc >= 4.6 (compiled in FFTW with --enable-quad-precision) */
|
||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \
|
||||
&& !(defined(__ICC) || defined(__INTEL_COMPILER) || defined(__CUDACC__) || defined(__PGI)) \
|
||||
&& (defined(__i386__) || defined(__x86_64__) || defined(__ia64__))
|
||||
# if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)
|
||||
/* note: __float128 is a typedef, which is not supported with the _Complex
|
||||
keyword in gcc, so instead we use this ugly __attribute__ version.
|
||||
However, we can't simply pass the __attribute__ version to
|
||||
FFTW_DEFINE_API because the __attribute__ confuses gcc in pointer
|
||||
types. Hence redefining FFTW_DEFINE_COMPLEX. Ugh. */
|
||||
# undef FFTW_DEFINE_COMPLEX
|
||||
# define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C
|
||||
# endif
|
||||
FFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex)
|
||||
#endif
|
||||
|
||||
#define FFTW_FORWARD (-1)
|
||||
#define FFTW_BACKWARD (+1)
|
||||
|
||||
#define FFTW_NO_TIMELIMIT (-1.0)
|
||||
|
||||
/* documented flags */
|
||||
#define FFTW_MEASURE (0U)
|
||||
#define FFTW_DESTROY_INPUT (1U << 0)
|
||||
#define FFTW_UNALIGNED (1U << 1)
|
||||
#define FFTW_CONSERVE_MEMORY (1U << 2)
|
||||
#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */
|
||||
#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */
|
||||
#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */
|
||||
#define FFTW_ESTIMATE (1U << 6)
|
||||
#define FFTW_WISDOM_ONLY (1U << 21)
|
||||
|
||||
/* undocumented beyond-guru flags */
|
||||
#define FFTW_ESTIMATE_PATIENT (1U << 7)
|
||||
#define FFTW_BELIEVE_PCOST (1U << 8)
|
||||
#define FFTW_NO_DFT_R2HC (1U << 9)
|
||||
#define FFTW_NO_NONTHREADED (1U << 10)
|
||||
#define FFTW_NO_BUFFERING (1U << 11)
|
||||
#define FFTW_NO_INDIRECT_OP (1U << 12)
|
||||
#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */
|
||||
#define FFTW_NO_RANK_SPLITS (1U << 14)
|
||||
#define FFTW_NO_VRANK_SPLITS (1U << 15)
|
||||
#define FFTW_NO_VRECURSE (1U << 16)
|
||||
#define FFTW_NO_SIMD (1U << 17)
|
||||
#define FFTW_NO_SLOW (1U << 18)
|
||||
#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19)
|
||||
#define FFTW_ALLOW_PRUNING (1U << 20)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* FFTW3_H */
|
|
@ -0,0 +1,7 @@
|
|||
Сборка FFTW для LINUX
|
||||
Для того чтобы разрешить позиционно-независимый код необходимо FFTW3 конфигурировать с флагом --enable-shared
|
||||
|
||||
./configure --enable-shared
|
||||
make
|
||||
|
||||
После этого в скрытой дириктории .lib появится so файл и a файл. Статический файл a можно ликновать с so и подключать в so библиотеку.
|
|
@ -0,0 +1,164 @@
|
|||
#ifdef WIN_OS
|
||||
#include <windows.h>
|
||||
#endif //WIN_OS
|
||||
|
||||
#ifdef LINUX_OS
|
||||
#include <dlfcn.h>
|
||||
#endif //LINUX_OS
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
#ifndef BUILD_LIB
|
||||
p_blas_dscal blas_dscal ;
|
||||
p_dft dft ;
|
||||
p_dft_cmplx dft_cmplx ;
|
||||
p_fft_create fft_create ;
|
||||
p_fft_destroy fft_destroy ;
|
||||
p_fft_cmplx fft_cmplx ;
|
||||
p_fft_shift fft_shift ;
|
||||
|
||||
|
||||
#endif //BUILD_LIB
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void* dspl_load()
|
||||
{
|
||||
#ifdef WIN_OS
|
||||
HINSTANCE handle;
|
||||
char* fname;
|
||||
handle = LoadLibrary(TEXT("libdspl.dll"));
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.dll loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fname = "dft";
|
||||
dft = (p_dft)GetProcAddress(handle, fname);
|
||||
if(!dft) goto exit_label;
|
||||
|
||||
fname = "dft_cmplx";
|
||||
dft_cmplx = (p_dft_cmplx)GetProcAddress(handle, fname);
|
||||
if(!dft_cmplx) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_create";
|
||||
fft_create = (p_fft_create)GetProcAddress(handle, fname);
|
||||
if(!fft_create) goto exit_label;
|
||||
|
||||
fname = "fft_destroy";
|
||||
fft_destroy = (p_fft_destroy)GetProcAddress(handle, fname);
|
||||
if(!fft_destroy) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_cmplx";
|
||||
fft_cmplx = (p_fft_cmplx)GetProcAddress(handle, fname);
|
||||
if(!fft_cmplx) goto exit_label;
|
||||
|
||||
fname = "fft_shift";
|
||||
fft_shift = (p_fft_shift)GetProcAddress(handle, fname);
|
||||
if(!fft_shift) goto exit_label;
|
||||
|
||||
|
||||
return (void*)handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
FreeLibrary(handle);
|
||||
return NULL;
|
||||
#endif //WIN_OS
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
char* error;
|
||||
void *handle;
|
||||
char* fname;
|
||||
|
||||
// open the *.so
|
||||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.so loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
fname = "blas_dscal";
|
||||
blas_dscal = (p_blas_dscal)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
fname = "dft";
|
||||
dft = (p_dft)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "dft_cmplx";
|
||||
dft_cmplx = (p_dft_cmplx)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
fname = "fft_create";
|
||||
fft_create = (p_fft_create)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_destroy";
|
||||
fft_destroy = (p_fft_destroy)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_cmplx";
|
||||
fft_cmplx = (p_fft_cmplx)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
fname = "fft_shift";
|
||||
fft_shift = (p_fft_shift)dlsym(handle, fname);
|
||||
if ((error = dlerror()) != NULL) goto exit_label;
|
||||
|
||||
|
||||
return handle;
|
||||
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
#endif //LINUX_OS
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void dspl_free(void* handle)
|
||||
{
|
||||
#ifdef WIN_OS
|
||||
FreeLibrary((HINSTANCE)handle);
|
||||
#endif //WIN_OS
|
||||
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
dlclose(handle);
|
||||
#endif //LINUX_OS
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
#ifndef DSPL_H
|
||||
#define DSPL_H
|
||||
|
||||
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
/* math const definition */
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.1415926535897932384626433832795
|
||||
#endif
|
||||
#ifndef M_2PI
|
||||
#define M_2PI 6.283185307179586476925286766559
|
||||
#endif
|
||||
|
||||
|
||||
typedef double complex_t[2];
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void *pfftw;
|
||||
complex_t *in;
|
||||
complex_t *out;
|
||||
size_t size;
|
||||
} fft_t;
|
||||
|
||||
|
||||
#define RE(x) (x[0])
|
||||
#define IM(x) (x[1])
|
||||
|
||||
|
||||
#define SQR(x) ((x) * (x))
|
||||
#define ABSSQR(x) ((SQR(RE(x))) + (SQR(IM(x))))
|
||||
#define ABS(x) sqrt((ABSSQR(x)))
|
||||
|
||||
#define CMRE(a,b) ((RE(a)) * (RE(b)) - (IM(a)) * (IM(b)))
|
||||
#define CMIM(a,b) ((RE(a)) * (IM(b)) + (IM(a)) * (RE(b)))
|
||||
|
||||
#define CMCONJRE(a, b) ((RE(a)) * (RE(b)) + (IM(a)) * (IM(b)))
|
||||
#define CMCONJIM(a, b) ((IM(a)) * (RE(b)) - (RE(a)) * (IM(b)))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define RES_OK 0
|
||||
|
||||
/* Error codes */
|
||||
/* A 0x01xxxxxx*/
|
||||
/* B 0x02xxxxxx*/
|
||||
/* C 0x03xxxxxx*/
|
||||
/* D 0x04xxxxxx*/
|
||||
#define ERROR_DAT_TYPE 0x04012020
|
||||
#define ERROR_DIV_ZERO 0x04102226
|
||||
/* E 0x05xxxxxx*/
|
||||
#define ERROR_ELLIP_MODULE 0x05121315
|
||||
/* F 0x06xxxxxx*/
|
||||
#define ERROR_FFT_CREATE 0x06060318
|
||||
#define ERROR_FILTER_A0 0x06100100
|
||||
#define ERROR_FILTER_ORD 0x06101518
|
||||
#define ERROR_FILTER_RP 0x06101816
|
||||
#define ERROR_FILTER_RS 0x06101819
|
||||
#define ERROR_FNAME 0x06140113
|
||||
#define ERROR_FOPEN 0x06151605
|
||||
#define ERROR_FWRITE_SIZE 0x06231820
|
||||
/* G 0x07xxxxxx*/
|
||||
/* H 0x08xxxxxx*/
|
||||
/* I 0x09xxxxxx*/
|
||||
/* J 0x10xxxxxx*/
|
||||
/* K 0x11xxxxxx*/
|
||||
/* L 0x12xxxxxx*/
|
||||
/* M 0x13xxxxxx*/
|
||||
/* N 0x14xxxxxx*/
|
||||
#define ERROR_NEGATIVE 0x14050701
|
||||
/* O 0x15xxxxxx*/
|
||||
/* P 0x16xxxxxx*/
|
||||
#define ERROR_POLY_ORD 0x16151518
|
||||
#define ERROR_PTR 0x16201800
|
||||
/* Q 0x17xxxxxx*/
|
||||
/* R 0x18xxxxxx*/
|
||||
#define ERROR_RAND_SIGMA 0x18011909
|
||||
#define ERROR_RESAMPLE_RATIO 0x18051801
|
||||
#define ERROR_RESAMPLE_FRAC_DELAY 0x18050604
|
||||
/* S 0x19xxxxxx*/
|
||||
#define ERROR_SIZE 0x19092605
|
||||
#define ERROR_SYM_TYPE 0x19251320
|
||||
/* T 0x20xxxxxx*/
|
||||
/* U 0x21xxxxxx*/
|
||||
/* V 0x22xxxxxx*/
|
||||
/* W 0x23xxxxxx*/
|
||||
#define ERROR_WIN_TYPE 0x23092025
|
||||
#define ERROR_WIN_SYM 0x23091925
|
||||
/* X 0x24xxxxxx*/
|
||||
/* Y 0x25xxxxxx*/
|
||||
/* Z 0x26xxxxxx*/
|
||||
|
||||
|
||||
#define DAT_DOUBLE 0
|
||||
#define DAT_COMPLEX 1
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// Declare DSPL_API for Windows OS
|
||||
#ifdef BUILD_LIB
|
||||
|
||||
#ifdef WIN_OS
|
||||
#define DSPL_API __declspec(dllexport)
|
||||
#endif // WIN_OS
|
||||
|
||||
#ifdef LINUX_OS
|
||||
#define DSPL_API
|
||||
#endif //LINUX_OS
|
||||
|
||||
|
||||
void DSPL_API blas_dscal(int n, double a, double* x, int incx);
|
||||
|
||||
int DSPL_API dft (double* x, int n, complex_t *y);
|
||||
int DSPL_API dft_cmplx (complex_t* x, int n, complex_t *y);
|
||||
|
||||
|
||||
int DSPL_API fft_create ( fft_t *pfft, int n);
|
||||
void DSPL_API fft_destroy (fft_t *pfft);
|
||||
int DSPL_API fft_cmplx (complex_t *x, int n, fft_t* pfft, complex_t* y);
|
||||
int DSPL_API fft_shift (double* x, int n, double* y);
|
||||
|
||||
|
||||
#else //BUILD_LIB
|
||||
|
||||
|
||||
|
||||
typedef void (*p_blas_dscal)(int n, double a, double* x, int incx);
|
||||
|
||||
typedef int (*p_dft ) (double* x, int n, complex_t *y);
|
||||
typedef int (*p_dft_cmplx ) (complex_t* x, int n, complex_t *y);
|
||||
typedef int (*p_fft_create ) (fft_t *pfft, int n);
|
||||
typedef void(*p_fft_destroy ) (fft_t *pfft);
|
||||
typedef int (*p_fft_cmplx ) (complex_t *x, int n, fft_t* pfft, complex_t* y);
|
||||
typedef int (*p_fft_shift ) (double* x, int n, double* y);
|
||||
|
||||
|
||||
|
||||
extern p_blas_dscal blas_dscal ;
|
||||
extern p_dft dft ;
|
||||
extern p_dft_cmplx dft_cmplx ;
|
||||
extern p_fft_create fft_create ;
|
||||
extern p_fft_destroy fft_destroy ;
|
||||
extern p_fft_cmplx fft_cmplx ;
|
||||
extern p_fft_shift fft_shift ;
|
||||
|
||||
#endif //BUILD_DLL
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void* dspl_load();
|
||||
void dspl_free(void* handle);
|
||||
|
||||
|
||||
|
||||
#endif //DSPL_H
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "dspl.h"
|
||||
|
||||
#define N 16
|
||||
int main()
|
||||
{
|
||||
void* handle;
|
||||
handle = dspl_load();
|
||||
|
||||
double x[N];
|
||||
double a = 2.0;
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
x[k] = (double)k;
|
||||
|
||||
blas_dscal(N, a, x, 1);
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
printf("x[%2d] = %9.3f \n", k, x[k]);
|
||||
|
||||
// remember to free the resource
|
||||
dspl_free(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "dspl.h"
|
||||
|
||||
#define N 16
|
||||
int main()
|
||||
{
|
||||
void* handle;
|
||||
handle = dspl_load();
|
||||
|
||||
complex_t x[N];
|
||||
complex_t y[N];
|
||||
complex_t z[N];
|
||||
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
{
|
||||
RE(x[k]) = (double)k;
|
||||
IM(x[k]) = 0.0;
|
||||
}
|
||||
|
||||
dft_cmplx(x,N,y);
|
||||
|
||||
fft_t pfft;
|
||||
memset(&pfft, 0, sizeof(fft_t));
|
||||
//
|
||||
fft_create(&pfft,N);
|
||||
fft_cmplx(x, N, &pfft, z);
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
printf("y[%2d] = %9.3f%9.3f z[%2d] = %9.3f%9.3f \n", k, RE(y[k]), IM(y[k]), k, RE(z[k]), IM(z[k]));
|
||||
|
||||
|
||||
fft_destroy(&pfft);
|
||||
// remember to free the resource
|
||||
dspl_free(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Ładowanie…
Reference in New Issue