-
Notifications
You must be signed in to change notification settings - Fork 3
/
specplot.cpp
77 lines (67 loc) · 1.64 KB
/
specplot.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* Copyright 2014 by Idiap Research Institute, http://www.idiap.ch
*
* See the file COPYING for the licence associated with this software.
*
* Author(s):
* Phil Garner, August 2014
*/
#include <lube.h>
#include "ssp/ssp.h"
#include "ssp/ar.h"
using namespace std;
using namespace ssp;
int main(int argc, char** argv)
{
// Options
lube::Option opt("specplot: plot sound spectrogram");
opt("Waveform file is the first argument");
opt.parse(argc, argv);
// Read the waveform from file
PCM pcm;
var arg = opt.args();
if (arg.size() < 1)
opt.usage(0);
var wav = arg[0];
var a = pcm.read(wav);
// Frame it
int frameSize = 256;
int framePeriod = 128;
var f = pcm.frame(a, frameSize, framePeriod);
// Window the frames
var w = nuttall(frameSize);
f *= w;
// Choose the output type
ind ti = arg.index("-t");
var t = ti ? arg[ti+1] : "spec";
var p;
if (t == "spec")
{
// Fourier transform
lube::DFT dft(frameSize);
var s = dft(f);
// Periodogram
p = lube::norm(s);
}
else if (t == "ar")
{
// LP spectrum
int order = arorder(pcm.rate());
Autocorrelation ac(frameSize);
var af = ac(f);
Levinson ar(order);
var lf = ar(af);
Gain gain(order);
var g = gain(af, lf);
Spectrum s(order, 129);
p = s(lf, g);
}
// Plot
var gnu;
gnu.push("plot \"-\" matrix with image");
gnu.push(lube::log(p+1e-8));
lube::filemodule gnum("gnuplot");
lube::file& gnuf = gnum.create();
gnuf.write(lube::nil, gnu);
return 0;
}