@@ -10,6 +10,7 @@ import "github.com/faiface/beep/wav"
10
10
import "github.com/mewkiz/flac"
11
11
import "math"
12
12
import "math/rand"
13
+ import "encoding/binary"
13
14
14
15
func dumpbuffer (buf [][2 ]float64 , mels int ) (out []uint16 ) {
15
16
stride := len (buf ) / mels
@@ -41,7 +42,13 @@ func dumpbuffer(buf [][2]float64, mels int) (out []uint16) {
41
42
return
42
43
}
43
44
44
- func loadpng (name string , reverse bool , spread int ) (buf [][2 ]float64 ) {
45
+ func unpackBytesToFloat64 (bytes []byte ) float64 {
46
+ bits := binary .LittleEndian .Uint64 (bytes ) // Read the bits from the byte slice
47
+ f := math .Float64frombits (bits ) // Convert uint64 bits to float64
48
+ return f
49
+ }
50
+
51
+ func loadpng (name string , reverse bool ) (buf [][2 ]float64 ) {
45
52
// Open the PNG file
46
53
file , err := os .Open (name )
47
54
if err != nil {
@@ -59,7 +66,7 @@ func loadpng(name string, reverse bool, spread int) (buf [][2]float64) {
59
66
60
67
// Get the bounds of the image
61
68
bounds := img .Bounds ()
62
- var mgc float64
69
+ var floats [] byte
63
70
for y := bounds .Min .Y ; y < bounds .Max .Y ; y ++ {
64
71
for x := bounds .Min .X ; x < bounds .Max .X ; x ++ {
65
72
@@ -71,22 +78,37 @@ func loadpng(name string, reverse bool, spread int) (buf [][2]float64) {
71
78
// Get the color of the pixel at (x, y)
72
79
color = img .At (x , y )
73
80
}
74
- r , g , b , a := color .RGBA ()
81
+ r , g , b , _ := color .RGBA ()
75
82
76
- //println(128 + int(b) - ((int(a))/2))
77
- mgc = math .Ldexp (1 , - 128 + int (b )/ int (math .Sqrt (float64 (a ))))
83
+ if x == 0 && y < 16 {
84
+ floats = append (floats , byte (b >> 8 ))
85
+ }
78
86
79
- val0 := ( mgc - float64 (r ) / float64 ( a )) * float64 ( spread )
80
- val1 := ( mgc - float64 (g ) / float64 ( a )) * float64 ( spread )
87
+ val0 := float64 (r >> 8 ) / 255
88
+ val1 := float64 (g >> 8 ) / 255
81
89
82
90
val := [2 ]float64 {val0 , val1 }
83
91
84
92
buf = append (buf , val )
85
93
}
86
94
}
95
+ var mgc_max , mgc_min = unpackBytesToFloat64 (floats [0 :8 ]), unpackBytesToFloat64 (floats [8 :16 ])
96
+
97
+ for i := range buf {
98
+ buf [i ][0 ] = (buf [i ][0 ]* (mgc_max - mgc_min ) + mgc_min )
99
+ buf [i ][1 ] = (buf [i ][1 ]* (mgc_max - mgc_min ) + mgc_min )
100
+ }
101
+ //dumpimage("test.png", buf, 160, reverse)
87
102
return
88
103
}
89
104
105
+ func packFloat64ToBytes (f float64 ) []byte {
106
+ bits := math .Float64bits (f ) // Convert float64 to uint64
107
+ bytes := make ([]byte , 8 ) // Create a byte slice of size 8
108
+ binary .LittleEndian .PutUint64 (bytes , bits ) // Write the bits to the byte slice in little-endian order
109
+ return bytes
110
+ }
111
+
90
112
func dumpimage (name string , buf [][2 ]float64 , mels int , reverse bool ) error {
91
113
92
114
f , err := os .Create (name )
@@ -113,16 +135,16 @@ func dumpimage(name string, buf [][2]float64, mels int, reverse bool) error {
113
135
}
114
136
}
115
137
}
116
- _ , exp := math . Frexp ( (mgc_max + mgc_min ) / 2 )
117
- exp += 128
138
+ floats := append ( packFloat64ToBytes (mgc_max ), packFloat64ToBytes ( mgc_min )... )
139
+ //println(mgc_max, mgc_min)
118
140
for x := 0 ; x < stride ; x ++ {
119
141
for y := 0 ; y < mels ; y ++ {
120
142
var col color.NRGBA
121
143
val0 := (buf [stride * y + x ][0 ] - mgc_min ) / (mgc_max - mgc_min )
122
144
val1 := (buf [stride * y + x ][1 ] - mgc_min ) / (mgc_max - mgc_min )
123
145
col .R = uint8 (int (255 * val0 ))
124
146
col .G = uint8 (int (255 * val1 ))
125
- col .B = uint8 (int (exp ))
147
+ col .B = uint8 (int (floats [ y & 15 ] ))
126
148
col .A = uint8 (255 )
127
149
if reverse {
128
150
img .SetNRGBA (x , mels - y - 1 , col )
@@ -255,83 +277,71 @@ func hz_to_mel(value float64) float64 {
255
277
}
256
278
257
279
func domel (filtersize , mels int , spectrum [][2 ]float64 , mel_fmin , mel_fmax float64 ) (melspectrum [][2 ]float64 ) {
258
-
259
- var melbin = hz_to_mel (mel_fmax ) / float64 (mels )
280
+ melbin := hz_to_mel (mel_fmax ) / float64 (mels )
260
281
261
282
for i := 0 ; i < mels ; i ++ {
262
- //var j = 0
263
283
for j := 0 ; j < len (spectrum ); j += filtersize {
284
+ vallo := float64 (filtersize ) * (mel_fmin + mel_to_hz (melbin * float64 (i ))) / (mel_fmax + mel_fmin )
285
+ valhi := float64 (filtersize ) * (mel_fmin + mel_to_hz (melbin * float64 (i + 1 ))) / (mel_fmax + mel_fmin )
264
286
265
- var vallo = float64 (filtersize ) * (mel_fmin + mel_to_hz (melbin * float64 (i + 0 ))) / (mel_fmax + mel_fmin )
266
- var valhi = float64 (filtersize ) * (mel_fmin + mel_to_hz (melbin * float64 (i + 1 ))) / (mel_fmax + mel_fmin )
267
-
268
- var inlo , modlo = math .Modf (vallo )
269
- var inhi = math .Floor (valhi )
287
+ inlo , modlo := math .Modf (vallo )
288
+ inhi := math .Floor (valhi )
270
289
if inlo < 0 {
271
290
inlo , modlo , inhi = 0 , 0 , 0
272
291
}
292
+
273
293
var tot [2 ]float64
274
294
for l := 0 ; l < 2 ; l ++ {
275
-
276
295
var total float64
277
296
278
297
if int (inlo )+ 1 == int (inhi ) {
279
- total += spectrum [j + int (inlo )][l ] * float64 ( 1 - modlo )
280
- total += spectrum [j + int (inhi )][l ] * float64 ( modlo )
298
+ total += spectrum [j + int (inlo )][l ] * ( 1 - modlo )
299
+ total += spectrum [j + int (inhi )][l ] * modlo
281
300
} else {
282
-
283
301
for k := int (inlo ); k < int (inhi ); k ++ {
284
- var sample = spectrum [j + k ][l ]
285
- total += sample
302
+ total += spectrum [j + k ][l ]
286
303
}
304
+ total /= float64 (int (inhi ) - int (inlo ) + 1 )
287
305
}
288
306
289
- total /= float64 (int (inhi ) - int (inlo ) + 1 )
290
-
291
307
tot [l ] = total
292
308
}
293
309
melspectrum = append (melspectrum , tot )
294
-
295
310
}
296
311
}
297
312
298
313
return
299
-
300
314
}
301
315
302
316
func undomel (filtersize , mels int , melspectrum [][2 ]float64 , mel_fmin , mel_fmax float64 ) (spectrum [][2 ]float64 ) {
303
- var filterbin = hz_to_mel (mel_fmax ) / float64 (mels )
304
- //originalLength := filtersize * mels
317
+ filterbin := hz_to_mel (mel_fmax ) / float64 (mels )
305
318
stride := len (melspectrum ) / mels
306
319
307
320
for j := 0 ; j < len (melspectrum )/ mels ; j ++ {
308
-
309
321
for i := 0 ; i < filtersize ; i ++ {
310
-
311
322
vallo := float64 (hz_to_mel ((float64 (i )* (mel_fmax + mel_fmin )/ float64 (filtersize ))- mel_fmin ) / filterbin )
312
323
valhi := float64 (hz_to_mel ((float64 (i + 1 )* (mel_fmax + mel_fmin )/ float64 (filtersize ))- mel_fmin ) / filterbin )
313
324
314
- var inlo , _ = math .Modf (vallo )
315
- var inhi = math .Floor (valhi )
325
+ inlo , modlo : = math .Modf (vallo )
326
+ inhi : = math .Floor (valhi )
316
327
if inlo < 0 {
317
- inlo , inhi = 0 , 0
328
+ inlo , modlo , inhi = 0 , 0 , 0
318
329
}
330
+
319
331
var tot [2 ]float64
320
332
for l := 0 ; l < 2 ; l ++ {
321
333
var total float64
322
334
323
335
if int (inlo ) == int (inhi ) {
324
336
total += melspectrum [j + stride * int (inlo )][l ]
325
337
} else if int (inlo )+ 1 == int (inhi ) && int (inhi ) < mels {
326
- total += melspectrum [j + stride * int (inlo )][l ] / 2
327
- total += melspectrum [j + stride * int (inhi )][l ] / 2
338
+ total += melspectrum [j + stride * int (inlo )][l ] * ( 1 - modlo )
339
+ total += melspectrum [j + stride * int (inhi )][l ] * modlo
328
340
} else {
329
-
330
341
for k := int (inlo ); k < int (inhi ); k ++ {
331
- var sample = melspectrum [j + stride * k ][l ]
332
- sample /= inhi - inlo
333
- total += sample
342
+ total += melspectrum [j + stride * k ][l ]
334
343
}
344
+ total /= inhi - inlo + 1
335
345
}
336
346
337
347
tot [l ] = total
0 commit comments