miniDSP
A small C library for audio DSP
Loading...
Searching...
No Matches
minidsp.h
Go to the documentation of this file.
1
17#ifndef MINIDSP_H
18#define MINIDSP_H
19
20#include <string.h>
21#include <assert.h>
22#include <stdlib.h>
23#include <math.h>
24
25/* M_PI is not guaranteed by the C standard. Define it if the system didn't. */
26#ifndef M_PI
27#define M_PI 3.14159265358979323846
28#endif
29#include <float.h>
30#include <complex.h>
31#include <fftw3.h>
32
33/* -----------------------------------------------------------------------
34 * Basic signal measurement functions
35 * -----------------------------------------------------------------------*/
36
41double MD_dot(const double *a, const double *b, unsigned N);
42
50double MD_entropy(const double *a, unsigned N, bool clip);
51
53double MD_energy(const double *a, unsigned N);
54
56double MD_power(const double *a, unsigned N);
57
59double MD_power_db(const double *a, unsigned N);
60
61/* -----------------------------------------------------------------------
62 * Signal scaling and conditioning
63 * -----------------------------------------------------------------------*/
64
69double MD_scale(double in,
70 double oldmin, double oldmax,
71 double newmin, double newmax);
72
74void MD_scale_vec(double *in, double *out, unsigned N,
75 double oldmin, double oldmax,
76 double newmin, double newmax);
77
83void MD_fit_within_range(double *in, double *out, unsigned N,
84 double newmin, double newmax);
85
90void MD_adjust_dblevel(const double *in, double *out,
91 unsigned N, double dblevel);
92
93/* -----------------------------------------------------------------------
94 * FFT / Spectrum Analysis
95 * -----------------------------------------------------------------------*/
96
137void MD_magnitude_spectrum(const double *signal, unsigned N, double *mag_out);
138
185void MD_power_spectral_density(const double *signal, unsigned N, double *psd_out);
186
231void MD_phase_spectrum(const double *signal, unsigned N, double *phase_out);
232
257unsigned MD_stft_num_frames(unsigned signal_len, unsigned N, unsigned hop);
258
314void MD_stft(const double *signal, unsigned signal_len,
315 unsigned N, unsigned hop,
316 double *mag_out);
317
318/* -----------------------------------------------------------------------
319 * Window generation
320 * -----------------------------------------------------------------------*/
321
327void MD_Gen_Hann_Win(double *out, unsigned n);
328
329/* -----------------------------------------------------------------------
330 * Signal generators
331 * -----------------------------------------------------------------------*/
332
354void MD_sine_wave(double *output, unsigned N, double amplitude,
355 double freq, double sample_rate);
356
380void MD_white_noise(double *output, unsigned N, double amplitude,
381 unsigned seed);
382
406void MD_impulse(double *output, unsigned N, double amplitude, unsigned position);
407
437void MD_chirp_linear(double *output, unsigned N, double amplitude,
438 double f_start, double f_end, double sample_rate);
439
472void MD_chirp_log(double *output, unsigned N, double amplitude,
473 double f_start, double f_end, double sample_rate);
474
506void MD_square_wave(double *output, unsigned N, double amplitude,
507 double freq, double sample_rate);
508
536void MD_sawtooth_wave(double *output, unsigned N, double amplitude,
537 double freq, double sample_rate);
538
539/* -----------------------------------------------------------------------
540 * Resource cleanup
541 * -----------------------------------------------------------------------*/
542
544void MD_shutdown(void);
545
546/* -----------------------------------------------------------------------
547 * Generalized Cross-Correlation (GCC) for delay estimation
548 * -----------------------------------------------------------------------
549 *
550 * Given two microphone signals that captured the same sound source,
551 * GCC-PHAT estimates how many samples one signal is delayed relative
552 * to the other. This is the basis of acoustic source localisation.
553 *
554 * The algorithm:
555 * 1. FFT both signals.
556 * 2. Multiply one spectrum by the conjugate of the other (cross-spectrum).
557 * 3. Apply a weighting (PHAT normalises by magnitude, sharpening the peak).
558 * 4. Inverse-FFT back to the time domain.
559 * 5. The position of the peak tells you the delay in samples.
560 */
561
567
578void MD_get_multiple_delays(const double **sigs, unsigned M, unsigned N,
579 unsigned margin, int weightfunc,
580 int *outdelays);
581
594int MD_get_delay(const double *siga, const double *sigb, unsigned N,
595 double *ent, unsigned margin, int weightfunc);
596
607void MD_gcc(const double *siga, const double *sigb, unsigned N,
608 double *lagvals, int weightfunc);
609
610#endif /* MINIDSP_H */
void MD_chirp_linear(double *output, unsigned N, double amplitude, double f_start, double f_end, double sample_rate)
Generate a linear chirp (swept sine with linearly increasing frequency).
Definition minidsp.c:617
double MD_power(const double *a, unsigned N)
Compute signal power: energy divided by the number of samples.
Definition minidsp.c:333
void MD_power_spectral_density(const double *signal, unsigned N, double *psd_out)
Compute the power spectral density (PSD) of a real-valued signal.
Definition minidsp.c:765
void MD_white_noise(double *output, unsigned N, double amplitude, unsigned seed)
Generate Gaussian white noise.
Definition minidsp.c:566
void MD_sine_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a sine wave.
Definition minidsp.c:555
void MD_impulse(double *output, unsigned N, double amplitude, unsigned position)
Generate a discrete impulse (Kronecker delta).
Definition minidsp.c:608
void MD_scale_vec(double *in, double *out, unsigned N, double oldmin, double oldmax, double newmin, double newmax)
Map every element of a vector from one range to another.
Definition minidsp.c:379
void MD_phase_spectrum(const double *signal, unsigned N, double *phase_out)
Compute the one-sided phase spectrum of a real signal.
Definition minidsp.c:807
MD_GCC_WEIGHTING_TYPE
Weighting types for Generalized Cross-Correlation.
Definition minidsp.h:563
@ SIMP
Simple 1/N weighting (basic cross-correlation)
Definition minidsp.h:564
@ PHAT
Phase Transform weighting (sharper peaks, more robust to noise)
Definition minidsp.h:565
double MD_scale(double in, double oldmin, double oldmax, double newmin, double newmax)
Map a single value from one range to another.
Definition minidsp.c:369
void MD_Gen_Hann_Win(double *out, unsigned n)
Generate a Hanning window of length n.
Definition minidsp.c:543
double MD_energy(const double *a, unsigned N)
Compute signal energy: sum of squared samples.
Definition minidsp.c:318
void MD_stft(const double *signal, unsigned signal_len, unsigned N, unsigned hop, double *mag_out)
Compute the Short-Time Fourier Transform (STFT) of a real-valued signal.
Definition minidsp.c:860
double MD_entropy(const double *a, unsigned N, bool clip)
Compute the normalized entropy of a distribution.
Definition minidsp.c:483
void MD_shutdown(void)
Free all internally cached FFT plans and buffers.
Definition minidsp.c:276
double MD_power_db(const double *a, unsigned N)
Compute signal power in decibels: 10 * log10(power).
Definition minidsp.c:349
void MD_gcc(const double *siga, const double *sigb, unsigned N, double *lagvals, int weightfunc)
Compute the full generalized cross-correlation between two signals.
Definition minidsp.c:1028
void MD_get_multiple_delays(const double **sigs, unsigned M, unsigned N, unsigned margin, int weightfunc, int *outdelays)
Estimate delays between a reference signal and M-1 other signals.
Definition minidsp.c:913
double MD_dot(const double *a, const double *b, unsigned N)
Compute the dot product of two vectors.
Definition minidsp.c:298
void MD_sawtooth_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a sawtooth wave.
Definition minidsp.c:685
void MD_magnitude_spectrum(const double *signal, unsigned N, double *mag_out)
Compute the magnitude spectrum of a real-valued signal.
Definition minidsp.c:727
unsigned MD_stft_num_frames(unsigned signal_len, unsigned N, unsigned hop)
Compute the number of STFT frames for the given signal length and parameters.
Definition minidsp.c:835
void MD_fit_within_range(double *in, double *out, unsigned N, double newmin, double newmax)
Fit values within [newmin, newmax].
Definition minidsp.c:402
void MD_square_wave(double *output, unsigned N, double amplitude, double freq, double sample_rate)
Generate a square wave.
Definition minidsp.c:666
int MD_get_delay(const double *siga, const double *sigb, unsigned N, double *ent, unsigned margin, int weightfunc)
Estimate the delay between two signals.
Definition minidsp.c:978
void MD_adjust_dblevel(const double *in, double *out, unsigned N, double dblevel)
Automatic Gain Control: scale a signal so its power matches the requested dB level,...
Definition minidsp.c:438
void MD_chirp_log(double *output, unsigned N, double amplitude, double f_start, double f_end, double sample_rate)
Generate a logarithmic chirp (swept sine with exponentially increasing frequency).
Definition minidsp.c:639