Skip to content

Commit ba6a6ae

Browse files
committed
vertical compression tests
1 parent a316961 commit ba6a6ae

2 files changed

Lines changed: 53 additions & 8 deletions

File tree

src/Spectrogram.Dev/Program.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,38 @@ class Program
88
static void Main(string[] args)
99
{
1010
double[] audio = Read.WavInt16mono("../../../../../data/qrss-10min.wav");
11+
double[] window = FftSharp.Window.Hanning(1 << 14);
1112

12-
int sampleRate = 6000;
13+
Test_1x(audio, 6000, window);
14+
Test_4x(audio, 6000, window);
15+
}
16+
17+
static void Test_1x(double[] audio, int sampleRate, double[] window)
18+
{
1319
int fftSize = 1 << 15;
14-
int stepSize = (audio.Length / 1000);
20+
int stepSize = audio.Length / 1000;
1521

1622
var spec = new Spectrogram(sampleRate, fftSize, stepSize, 1200, 1300);
23+
spec.SetWindow(window);
1724

1825
spec.Add(audio);
1926
spec.Process();
2027
Bitmap bmp = spec.GetBitmap(multiplier: 2);
21-
bmp.Save("test.bmp");
28+
bmp.Save("test-1x.bmp");
29+
}
30+
31+
static void Test_4x(double[] audio, int sampleRate, double[] window)
32+
{
33+
int fftSize = 1 << 17;
34+
int stepSize = audio.Length / 1000;
35+
36+
var spec = new Spectrogram(sampleRate, fftSize, stepSize, 1200, 1300);
37+
spec.SetWindow(window);
38+
39+
spec.Add(audio);
40+
spec.Process();
41+
Bitmap bmp = spec.GetBitmapMax(multiplier: 2 * 3, reduction: 4);
42+
bmp.Save("test-4x.bmp");
2243
}
2344
}
2445
}

src/Spectrogram/Spectrogram.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Drawing;
44
using System.Drawing.Imaging;
5+
using System.Linq;
56
using System.Numerics;
67
using System.Runtime.InteropServices;
78
using System.Threading.Tasks;
@@ -47,11 +48,14 @@ public override string ToString()
4748

4849
public void SetWindow(double[] newWindow)
4950
{
50-
if (newWindow.Length != settings.FftSize)
51-
throw new ArgumentException("window length must equal FFT size");
51+
if (newWindow.Length > settings.FftSize)
52+
throw new ArgumentException("window length cannot exceed FFT size");
5253

5354
for (int i = 0; i < settings.FftSize; i++)
54-
settings.Window[i] = newWindow[i];
55+
settings.Window[i] = 0;
56+
57+
int offset = (settings.FftSize - newWindow.Length) / 2;
58+
Array.Copy(newWindow, 0, settings.Window, offset, newWindow.Length);
5559
}
5660

5761
public void Add(double[] audio)
@@ -96,8 +100,28 @@ public double[][] Process()
96100

97101
public Bitmap GetBitmap(double multiplier = 1, bool dB = false, bool roll = false)
98102
{
99-
if (Width == 0)
100-
return null;
103+
return _GetBitmap(ffts, multiplier, dB, roll, FftsProcessed);
104+
}
105+
106+
public Bitmap GetBitmapMax(double multiplier = 1, bool dB = false, bool roll = false, int reduction = 4)
107+
{
108+
List<double[]> ffts2 = new List<double[]>();
109+
for (int i = 0; i < ffts.Count; i++)
110+
{
111+
double[] d1 = ffts[i];
112+
double[] d2 = new double[d1.Length / reduction];
113+
for (int j = 0; j < d2.Length; j++)
114+
for (int k = 0; k < reduction; k++)
115+
d2[j] = Math.Max(d2[j], d1[j * reduction + k]);
116+
ffts2.Add(d2);
117+
}
118+
return _GetBitmap(ffts2, multiplier, dB, roll, FftsProcessed);
119+
}
120+
121+
private static Bitmap _GetBitmap(List<double[]> ffts, double multiplier = 1, bool dB = false, bool roll = false, int FftsProcessed = 0)
122+
{
123+
int Width = ffts.Count;
124+
int Height = ffts[0].Length;
101125

102126
Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
103127
new Colormaps.Viridis().Apply(bmp);

0 commit comments

Comments
 (0)