aboutsummaryrefslogtreecommitdiff
path: root/fft.c
diff options
context:
space:
mode:
Diffstat (limited to 'fft.c')
-rw-r--r--fft.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/fft.c b/fft.c
index f39fd2a..5d02291 100644
--- a/fft.c
+++ b/fft.c
@@ -15,6 +15,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include <err.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -26,8 +27,25 @@ struct fft {
double *in;
double *out;
int n;
+ double *window;
};
+double *
+hamming(int n)
+{
+ double *w;
+ int i;
+
+ w = calloc(n, sizeof(double));
+ if (!w)
+ errx(1, "malloc failed");
+
+ for (i = 0; i < n; i++)
+ w[i] = 0.54 - 0.46 * cos((2 * M_PI * i) / (n - 1));
+
+ return w;
+}
+
struct fft *
init_fft(int n)
{
@@ -47,17 +65,19 @@ init_fft(int n)
p[1].plan = fftw_plan_r2r_1d(n, p[1].in, p[1].out,
FFTW_R2HC, FFTW_MEASURE);
+ p->window = hamming(n);
+
return p;
}
int
-dofft(struct fft *p, int16_t *data, double *left, double *right, int n, double *wight, float scala)
+dofft(struct fft *p, int16_t *data, double *left, double *right, int n, float scala)
{
int i;
for (i = 0; i < n; i++) {
- p[0].in[i] = wight[i] * data[2 * i + 0] / (double)INT16_MAX;
- p[1].in[i] = wight[i] * data[2 * i + 1] / (double)INT16_MAX;
+ p[0].in[i] = p->window[i] * data[2 * i + 0] / (double)INT16_MAX;
+ p[1].in[i] = p->window[i] * data[2 * i + 1] / (double)INT16_MAX;
}
fftw_execute(p[0].plan);