MCPcopy Create free account
hub / github.com/audacity/audacity / ComputeSpectrum

Function ComputeSpectrum

libraries/lib-fft/Spectrum.cpp:22–123  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

20using Floats = ArrayOf<float>;
21
22bool ComputeSpectrum(
23 const float* data, size_t width, size_t windowSize, float* output,
24 bool autocorrelation, int windowFunc)
25{
26 if (width < windowSize)
27 return false;
28
29 if (!data || !output)
30 return true;
31
32 Floats processed{ windowSize };
33
34 for (size_t i = 0; i < windowSize; i++)
35 processed[i] = float(0.0);
36 auto half = windowSize / 2;
37
38 Floats in{ windowSize };
39 Floats out{ windowSize };
40 Floats out2{ windowSize };
41
42 size_t start = 0;
43 unsigned windows = 0;
44 while (start + windowSize <= width) {
45 for (size_t i = 0; i < windowSize; i++)
46 in[i] = data[start + i];
47
48 WindowFunc(windowFunc, windowSize, in.get());
49
50 if (autocorrelation) {
51 // Take FFT
52 RealFFT(windowSize, in.get(), out.get(), out2.get());
53 // Compute power
54 for (size_t i = 0; i < windowSize; i++)
55 in[i] = (out[i] * out[i]) + (out2[i] * out2[i]);
56
57 // Tolonen and Karjalainen recommend taking the cube root
58 // of the power, instead of the square root
59
60 for (size_t i = 0; i < windowSize; i++)
61 in[i] = powf(in[i], 1.0f / 3.0f);
62
63 // Take FFT
64 RealFFT(windowSize, in.get(), out.get(), out2.get());
65 }
66 else
67 PowerSpectrum(windowSize, in.get(), out.get());
68
69 // Take real part of result
70 for (size_t i = 0; i < half; i++)
71 processed[i] += out[i];
72
73 start += half;
74 windows++;
75 }
76
77 if (autocorrelation) {
78
79 // Peak Pruning as described by Tolonen and Karjalainen, 2000

Callers 2

DeduceFrequenciesMethod · 0.85
CalculateOneSpectrumMethod · 0.85

Calls 4

WindowFuncFunction · 0.85
RealFFTFunction · 0.85
PowerSpectrumFunction · 0.70
getMethod · 0.45

Tested by

no test coverage detected