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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user