1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-02-19 09:17:54 +01:00

pixel column counts and sample window sizes use unsigned types

This commit is contained in:
Paul Licameli
2016-09-08 14:28:34 -04:00
parent b910bf63da
commit ed21545c80
36 changed files with 1031 additions and 1010 deletions

View File

@@ -20,8 +20,8 @@
#include "Experimental.h"
bool ComputeSpectrum(const float * data, int width,
int windowSize,
bool ComputeSpectrum(const float * data, size_t width,
size_t windowSize,
double WXUNUSED(rate), float *output,
bool autocorrelation, int windowFunc)
{
@@ -33,19 +33,18 @@ bool ComputeSpectrum(const float * data, int width,
float *processed = new float[windowSize];
int i;
for (i = 0; i < windowSize; i++)
for (size_t i = 0; i < windowSize; i++)
processed[i] = float(0.0);
int half = windowSize / 2;
auto half = windowSize / 2;
float *in = new float[windowSize];
float *out = new float[windowSize];
float *out2 = new float[windowSize];
int start = 0;
int windows = 0;
size_t start = 0;
unsigned windows = 0;
while (start + windowSize <= width) {
for (i = 0; i < windowSize; i++)
for (size_t i = 0; i < windowSize; i++)
in[i] = data[start + i];
WindowFunc(windowFunc, windowSize, in);
@@ -54,13 +53,13 @@ bool ComputeSpectrum(const float * data, int width,
// Take FFT
RealFFT(windowSize, in, out, out2);
// Compute power
for (i = 0; i < windowSize; i++)
for (size_t i = 0; i < windowSize; i++)
in[i] = (out[i] * out[i]) + (out2[i] * out2[i]);
// Tolonen and Karjalainen recommend taking the cube root
// of the power, instead of the square root
for (i = 0; i < windowSize; i++)
for (size_t i = 0; i < windowSize; i++)
in[i] = powf(in[i], 1.0f / 3.0f);
// Take FFT
@@ -70,7 +69,7 @@ bool ComputeSpectrum(const float * data, int width,
PowerSpectrum(windowSize, in, out);
// Take real part of result
for (i = 0; i < half; i++)
for (size_t i = 0; i < half; i++)
processed[i] += out[i];
start += half;
@@ -85,7 +84,7 @@ bool ComputeSpectrum(const float * data, int width,
It should be safe, as indexes refer only to current and previous elements,
that have already been clipped, etc...
*/
for (i = 0; i < half; i++) {
for (size_t i = 0; i < half; i++) {
// Clip at zero, copy to temp array
if (processed[i] < 0.0)
processed[i] = float(0.0);
@@ -103,23 +102,23 @@ bool ComputeSpectrum(const float * data, int width,
}
// Reverse and scale
for (i = 0; i < half; i++)
for (size_t i = 0; i < half; i++)
in[i] = processed[i] / (windowSize / 4);
for (i = 0; i < half; i++)
for (size_t i = 0; i < half; i++)
processed[half - 1 - i] = in[i];
} else {
// Convert to decibels
// But do it safely; -Inf is nobody's friend
for (i = 0; i < half; i++){
for (size_t i = 0; i < half; i++){
float temp=(processed[i] / windowSize / windows);
if (temp > 0.0)
processed[i] = 10*log10(temp);
processed[i] = 10 * log10(temp);
else
processed[i] = 0;
}
}
for(i=0;i<half;i++)
for(size_t i = 0; i < half; i++)
output[i] = processed[i];
delete[]in;
delete[]out;