Skip to content

Commit df3708f

Browse files
committed
parallel processing
1 parent 158588e commit df3708f

6 files changed

Lines changed: 47 additions & 36 deletions

File tree

src/Spectrogram.Dev/Program.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
using System;
2+
using System.Drawing;
23

34
namespace Spectrogram.Dev
45
{
56
class Program
67
{
78
static void Main(string[] args)
89
{
9-
Console.WriteLine("Hello World!");
10+
double[] audio = Read.WavInt16mono("../../../../../data/qrss-10min.wav");
11+
Console.WriteLine("loaded");
12+
13+
int sampleRate = 6000;
14+
int fftSize = 1 << 15;
15+
int stepSize = (audio.Length / 1000);
16+
17+
var spec = new Spectrogram(sampleRate, fftSize, stepSize, 1200, 1300);
18+
spec.Add(audio);
19+
spec.Process();
20+
Bitmap bmp = spec.GetBitmap();
21+
bmp.Save("test.bmp");
1022
}
1123
}
1224
}

src/Spectrogram.Dev/Read.cs

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/Spectrogram.Dev/Spectrogram.Dev.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@
55
<TargetFramework>netcoreapp3.1</TargetFramework>
66
</PropertyGroup>
77

8+
<ItemGroup>
9+
<ProjectReference Include="..\Spectrogram\Spectrogram.csproj" />
10+
</ItemGroup>
11+
812
</Project>

src/Spectrogram/Settings.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Settings
1010

1111
// vertical information
1212
public readonly int FftSize;
13+
public readonly double FftLengthSec;
1314
public readonly double FreqNyquist;
1415
public readonly double HzPerPixel;
1516
public readonly int FftIndex1;
@@ -19,29 +20,23 @@ class Settings
1920
public readonly int Height;
2021

2122
// horizontal information
22-
public readonly int WindowSize;
23-
public readonly double WindowLengthSec;
2423
public readonly double[] Window;
2524
public readonly int StepSize;
2625
public readonly double StepLengthSec;
2726
public readonly double StepOverlapFrac;
2827
public readonly double StepOverlapSec;
2928

30-
public Settings(int sampleRate, int fftSize, int windowSize, int stepSize,
29+
public Settings(int sampleRate, int fftSize, int stepSize,
3130
double minFreq = 0, double maxFreq = double.PositiveInfinity)
3231
{
3332
if (FftSharp.Transform.IsPowerOfTwo(fftSize) == false)
3433
throw new ArgumentException("FFT size must be a power of 2");
3534

36-
if (FftSharp.Transform.IsPowerOfTwo(windowSize) == false)
37-
throw new ArgumentException("window size must be a power of 2");
38-
3935
// FFT info
4036
SampleRate = sampleRate;
4137
FftSize = fftSize;
42-
WindowSize = windowSize;
43-
WindowLengthSec = (double)WindowSize / SampleRate;
4438
StepSize = stepSize;
39+
FftLengthSec = (double)fftSize / sampleRate;
4540

4641
// vertical
4742
FreqNyquist = sampleRate / 2;
@@ -54,9 +49,9 @@ public Settings(int sampleRate, int fftSize, int windowSize, int stepSize,
5449

5550
// horizontal
5651
StepLengthSec = (double)StepSize / sampleRate;
57-
Window = FftSharp.Window.Hanning(WindowSize);
58-
StepOverlapSec = WindowLengthSec - StepLengthSec;
59-
StepOverlapFrac = StepOverlapSec / WindowLengthSec;
52+
Window = FftSharp.Window.Hanning(fftSize);
53+
StepOverlapSec = FftLengthSec - StepLengthSec;
54+
StepOverlapFrac = StepOverlapSec / FftLengthSec;
6055
}
6156
}
6257
}

src/Spectrogram/Spectrogram.cs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Drawing.Imaging;
55
using System.Numerics;
66
using System.Runtime.InteropServices;
7+
using System.Threading.Tasks;
78

89
namespace Spectrogram
910
{
@@ -16,10 +17,10 @@ public class Spectrogram
1617
private readonly List<double[]> ffts = new List<double[]>();
1718
private readonly List<double> newAudio = new List<double>();
1819

19-
public Spectrogram(int sampleRate, int fftSize, int windowSize, int stepSize,
20+
public Spectrogram(int sampleRate, int fftSize, int stepSize,
2021
double minFreq = 0, double maxFreq = double.PositiveInfinity)
2122
{
22-
settings = new Settings(sampleRate, fftSize, windowSize, stepSize, minFreq, maxFreq);
23+
settings = new Settings(sampleRate, fftSize, stepSize, minFreq, maxFreq);
2324
}
2425

2526
public void Add(double[] audio)
@@ -29,26 +30,30 @@ public void Add(double[] audio)
2930

3031
public void Process()
3132
{
32-
int fftsToProcess = (newAudio.Count - settings.WindowSize) / settings.StepSize;
33+
int fftsToProcess = (newAudio.Count - settings.FftSize) / settings.StepSize;
34+
if (fftsToProcess < 1)
35+
return;
3336

34-
for (int newFftIndex = 0; newFftIndex < fftsToProcess; newFftIndex++)
37+
double[][] newFfts = new double[fftsToProcess][];
38+
39+
Parallel.For(0, fftsToProcess, newFftIndex =>
3540
{
36-
// copy audio into complex buffer
37-
Complex[] buffer = new Complex[settings.WindowSize];
41+
Complex[] buffer = new Complex[settings.FftSize];
3842
int sourceIndex = newFftIndex * settings.StepSize;
39-
for (int i = 0; i < settings.WindowSize; i++)
40-
buffer[i] = new Complex(newAudio[sourceIndex] * settings.Window[i], 0);
43+
for (int i = 0; i < settings.FftSize; i++)
44+
buffer[i] = new Complex(newAudio[sourceIndex + i] * settings.Window[i], 0);
4145

42-
// perform FFT
43-
Console.WriteLine(buffer[100]);
4446
FftSharp.Transform.FFT(buffer);
4547

46-
// get magnitude just from the region of interest
47-
var newFft = new double[settings.Height];
48+
newFfts[newFftIndex] = new double[settings.Height];
4849
for (int i = 0; i < settings.Height; i++)
49-
newFft[i] = buffer[settings.FftIndex1 + i].Magnitude;
50+
newFfts[newFftIndex][i] = buffer[settings.FftIndex1 + i].Magnitude / settings.FftSize;
51+
});
52+
53+
foreach (var newFft in newFfts)
5054
ffts.Add(newFft);
51-
}
55+
56+
newAudio.RemoveRange(0, fftsToProcess * settings.StepSize);
5257
}
5358

5459
public Bitmap GetBitmap()

src/Spectrogram/Spectrogram.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@
44
<TargetFramework>netstandard2.0</TargetFramework>
55
</PropertyGroup>
66

7+
<ItemGroup>
8+
<PackageReference Include="FftSharp" Version="1.0.4" />
9+
<PackageReference Include="System.Drawing.Common" Version="4.7.0" />
10+
</ItemGroup>
11+
712
</Project>

0 commit comments

Comments
 (0)