Audio Visualisierung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Audio Visualisierung

    Hallo Leute,
    ich versuche jetzt schon seit mehreren Stunden herauszufinden, wie ich eine Audioquelle visualisieren kann. Ich habe schon viele Beispielcodes und Projekte ausprobiert aber bei keinem hat der FFT funktioniert. Ich habe auch mal versucht Hurricane auseinander zu nehmen aber die Layouts wollten nicht laden etc. Kann mir jemand damit helfen ?

    Danke schon mal im Voraus :)

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Es liegt ein Beispiel bei, das man recht einfach auseinander nehmen kann.
    Werde nicht anfangen für jedes mögliche Szenario eine Schritt für Schritt Anleitung zu schreiben.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @thefiloe
    Bei dem Beispiel habe ich das Problem, dass ich keine References hinzufügen kann und in der Fehlerliste steht, dass einige Projektdateien fehlen.

    @ThuCommix
    Ich bekomme da keinen Sourcecode heraus
    Verstehe ich jetzt nicht so. Habe das mal versucht:

    VB.NET-Quellcode

    1. Dim notificationSource = New SingleBlockNotificationStream(source)
    2. AddHandler notificationSource.SingleBlockRead, AddressOf SingleBlockRead

    VB.NET-Quellcode

    1. Public Sub SingleBlockRead(s, a)
    2. spectrumProvider.Add(a.Left, a.Right)
    3. End Sub
    Die Sub ist halt falsch deklariert. Entweder du Deklarierst gleich die Sub richtig mit ByVal und Datentyp oder verwendest wie ich Lambda-Ausdrücke.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich hab' die Sub auch schon versucht richtig zu deklarieren und mit Lambda-Ausdrücken habe ich mich noch nicht auseinander gesetzt. Liegt es vielleicht daran, dass ich "Visualization" und "Refrences" gelöscht habe ?

    C#-Quellcode

    1. notificationSource.SingleBlockRead += (s, a) => spectrumProvider.Add(a.Left, a.Right);
    Ist semantisch übersetzt:

    VB.NET-Quellcode

    1. AddHandler notificationSource.SingleBlockRead, Sub(s, a) spectrumProvider.Add(a.Left, a.Right)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner
    Danke, scheint zu funktionieren.
    Nur eigentlich sollte in einer PictureBox nun diese Balken angezeigt werden, was sie aber nicht tun.

    Hier ist der ganze code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports CSCore
    2. Imports CSCore.Codecs
    3. Imports CSCore.DSP
    4. Imports CSCore.SoundOut
    5. Imports CSCore.Streams
    6. Imports WinformsVisualization.Visualization
    7. Imports System.ComponentModel
    8. Partial Public Class Form1
    9. Inherits Form
    10. Private _soundOut As ISoundOut
    11. Private _lineSpectrum As LineSpectrum
    12. Private _voicePrint3DSpectrum As VoicePrint3DSpectrum
    13. Private ReadOnly _bitmap As New Bitmap(2000, 600)
    14. Private _xpos As Integer
    15. Private Sub [Stop]()
    16. timer1.[Stop]()
    17. If _soundOut IsNot Nothing Then
    18. Dim source As IWaveSource = _soundOut.WaveSource
    19. _soundOut.[Stop]()
    20. _soundOut.Dispose()
    21. source.Dispose()
    22. _soundOut = Nothing
    23. End If
    24. End Sub
    25. Private Sub timer1_Tick(sender As Object, e As EventArgs) Handles timer1.Tick
    26. GenerateLineSpectrum()
    27. End Sub
    28. Private Sub GenerateLineSpectrum()
    29. Dim image As Image = pictureBoxTop.Image
    30. pictureBoxTop.Image = _lineSpectrum.CreateSpectrumLine(pictureBoxTop.Size, Color.Green, Color.Red, Color.Black, True)
    31. If image IsNot Nothing Then
    32. image.Dispose()
    33. End If
    34. End Sub
    35. Private Sub openToolStripMenuItem_Click_1(sender As Object, e As EventArgs) Handles openToolStripMenuItem.Click
    36. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    37. [Stop]()
    38. Const fftSize__1 As FftSize = FftSize.Fft4096
    39. Dim source As IWaveSource = CodecFactory.Instance.GetCodec(OpenFileDialog1.FileName)
    40. Dim spectrumProvider = New BasicSpectrumProvider(source.WaveFormat.Channels, source.WaveFormat.SampleRate, fftSize__1)
    41. _lineSpectrum = New LineSpectrum(fftSize__1) With { _
    42. .SpectrumProvider = spectrumProvider, _
    43. .UseAverage = True, _
    44. .BarCount = 50, _
    45. .BarSpacing = 2, _
    46. .IsXLogScale = True, _
    47. .ScalingStrategy = ScalingStrategy.Sqrt _
    48. }
    49. Dim notificationSource = New SingleBlockNotificationStream(source)
    50. AddHandler notificationSource.SingleBlockRead, Sub(s, a) spectrumProvider.Add(a.Left, a.Right)
    51. source = notificationSource.ToWaveSource(16)
    52. _soundOut = New WasapiOut()
    53. _soundOut.Initialize(New LoopStream(source))
    54. _soundOut.Play()
    55. timer1.Start()
    56. propertyGridTop.SelectedObject = _lineSpectrum
    57. End If
    58. End Sub
    59. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    60. MyBase.OnClosing(e)
    61. [Stop]()
    62. End Sub
    63. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    64. InitializeComponent()
    65. End Sub
    66. End Class


    @thefiloe
    Ich hätte ein paar Fragen:
    -könntest du vielleicht schnell dein Beispielprojekt auf vb.net richtig übersetzen ?
    (wenn nicht, dann die nächste Frage bitte auf C# antworten)
    -wie kann ich statt einer z.B. MP3-Datei meinen Systemsound visualisieren ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „xd-franky-5“ ()

    Ich möchte dieses Thema gerne noch einmal aufgreifen. Ich habe eine Code gefunden von hier:whenimbored.xfx.net/2011/01/fa…-transform-written-in-vb/
    der soll wohl gehen. Kann mir vielleicht einer erklären, wie das funktioniert ? Heißt ich habe einen Dateipfad zu einer MP3 und möchte diese nun visualisieren. Hier der Code:
    Code

    Quellcode

    1. ​Imports System.Math
    2. Imports System.ComponentModel
    3. ' The FourierTransform function is based on the original work by Murphy McCauley
    4. ''' <exclude/>
    5. <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
    6. Public Module FFT
    7. Public Class ComplexDouble
    8. Public Property R() As Double
    9. Public Property I() As Double
    10. Public Sub New()
    11. End Sub
    12. Public Sub New(ByVal r As Double)
    13. Me.R = r
    14. End Sub
    15. Public Sub New(ByVal r As Double, ByVal i As Double)
    16. Me.R = r
    17. Me.I = i
    18. End Sub
    19. Public Function Power() As Double
    20. Return R ^ 2 + I ^ 2
    21. End Function
    22. Public Function Power2() As Double
    23. Return Math.Abs(R) + Math.Abs(I)
    24. End Function
    25. Public Function Power2Root() As Double
    26. Return Sqrt(Power2())
    27. End Function
    28. Public Function PowerRoot() As Double
    29. Return Sqrt(Power())
    30. End Function
    31. Public Function Conjugate() As ComplexDouble
    32. Return New ComplexDouble(R, -I)
    33. End Function
    34. Public Function Abs() As Double
    35. Return Sqrt(R ^ 2 + I ^ 2)
    36. End Function
    37. Public Shared Operator +(ByVal n1 As ComplexDouble, ByVal n2 As ComplexDouble) As ComplexDouble
    38. Return New ComplexDouble(n1.R + n2.R, n1.I + n2.I)
    39. End Operator
    40. Public Shared Operator +(ByVal n1 As ComplexDouble, ByVal n2 As Double) As ComplexDouble
    41. Return New ComplexDouble(n1.R + n2, n1.I)
    42. End Operator
    43. Public Shared Operator +(ByVal n1 As Double, ByVal n2 As ComplexDouble) As ComplexDouble
    44. Return New ComplexDouble(n1 + n2.R, n2.I)
    45. End Operator
    46. Public Shared Operator -(ByVal n1 As ComplexDouble, ByVal n2 As ComplexDouble) As ComplexDouble
    47. Return New ComplexDouble(n1.R - n2.R, n1.I - n2.I)
    48. End Operator
    49. Public Shared Operator -(ByVal n1 As ComplexDouble, ByVal n2 As Double) As ComplexDouble
    50. Return New ComplexDouble(n1.R - n2, n1.I)
    51. End Operator
    52. Public Shared Operator -(ByVal n1 As Double, ByVal n2 As ComplexDouble) As ComplexDouble
    53. Return New ComplexDouble(n1 - n2.R, -n2.I)
    54. End Operator
    55. Public Shared Operator *(ByVal n1 As ComplexDouble, ByVal n2 As ComplexDouble) As ComplexDouble
    56. Return New ComplexDouble(n1.R * n2.R - n1.I * n2.I, n1.I * n2.R + n2.I * n1.R)
    57. End Operator
    58. Public Shared Operator *(ByVal n1 As ComplexDouble, ByVal n2 As Double) As ComplexDouble
    59. Return New ComplexDouble(n1.R * n2, n1.I * n2)
    60. End Operator
    61. Public Shared Operator *(ByVal n1 As Double, ByVal n2 As ComplexDouble) As ComplexDouble
    62. Return New ComplexDouble(n1 * n2.R, n1 * n2.I)
    63. End Operator
    64. Public Shared Operator /(ByVal n1 As ComplexDouble, ByVal n2 As Double) As ComplexDouble
    65. Return New ComplexDouble(n1.R / n2, n1.I / n2)
    66. End Operator
    67. Public Shared Operator ^(ByVal n1 As ComplexDouble, ByVal n2 As Integer) As ComplexDouble
    68. Dim r As ComplexDouble = n1
    69. For i As Integer = 0 To n2 - 1
    70. r *= n1
    71. Next
    72. Return r
    73. End Operator
    74. Public Shared Function FromDouble(ByVal value As Double) As ComplexDouble
    75. Return New ComplexDouble(value, value)
    76. End Function
    77. Public Shared Function FromDouble(ByVal array() As Double) As ComplexDouble()
    78. Return (From d In array Select ComplexDouble.FromDouble(d)).ToArray()
    79. End Function
    80. End Class
    81. Private Const PI2 As Double = 2.0# * PI
    82. Private Const LHHALF As Integer = 30 ' half-length of Hilbert transform filter
    83. Private Const LH As Integer = 2 * LHHALF + 1 ' filter length must be odd
    84. Private Function NumberOfBitsNeeded(ByVal powerOfTwo As Integer) As Integer
    85. For i As Integer = 0 To 32
    86. If (powerOfTwo And CInt(2 ^ i)) <> 0 Then Return i
    87. Next i
    88. End Function
    89. Public Function IsPowerOfTwo(ByVal x As Integer) As Boolean
    90. Return Not ((x And (x - 1)) <> 0) AndAlso (x >= 2)
    91. End Function
    92. Private Function ReverseBits(ByVal index As Integer, ByVal numBits As Integer) As Integer
    93. Dim rev As Integer
    94. For i As Integer = 0 To numBits - CByte(1)
    95. rev = (rev * 2) Or (index And 1)
    96. index \= 2
    97. Next i
    98. Return rev
    99. End Function
    100. ' http://groovit.disjunkt.com/analog/time-domain/fft.html
    101. ' http://www.relisoft.com/science/Physics/sound.html
    102. ' Decimation-in-time in-place FFT algorithm
    103. Public Sub FourierTransform(ByVal fftSize As Integer,
    104. ByVal waveInL() As Double,
    105. ByVal fftOutL() As ComplexDouble,
    106. ByVal waveInR() As Double,
    107. ByVal fftOutR() As ComplexDouble,
    108. ByVal doInverse As Boolean)
    109. Static numBits As Integer
    110. Static i As Integer
    111. Static j As Integer
    112. Static k As Integer
    113. Static n As Integer
    114. Static deltaAngle As Double
    115. Static alpha As Double
    116. Static beta As Double
    117. Static tmp As ComplexDouble
    118. Static angle As ComplexDouble
    119. Static rBits() As Integer
    120. Static lastFFTSize As Integer
    121. Dim blockSize As Integer = 2
    122. Dim blockEnd As Integer = 1
    123. Dim inverter As Double = If(doInverse, -1.0#, 1.0#)
    124. If lastFFTSize <> fftSize Then
    125. lastFFTSize = fftSize
    126. ReDim rBits(fftSize - 1)
    127. numBits = NumberOfBitsNeeded(fftSize)
    128. For i = 0 To fftSize - 1
    129. rBits(i) = ReverseBits(i, numBits)
    130. fftOutL(rBits(i)) = New ComplexDouble(waveInL(i))
    131. fftOutR(rBits(i)) = New ComplexDouble(waveInR(i))
    132. Next i
    133. Else
    134. For i = 0 To fftSize - 1
    135. fftOutL(rBits(i)) = New ComplexDouble(waveInL(i))
    136. fftOutR(rBits(i)) = New ComplexDouble(waveInR(i))
    137. Next i
    138. End If
    139. Do
    140. deltaAngle = PI2 / blockSize * inverter
    141. alpha = 2.0# * Sin(0.5# * deltaAngle) ^ 2
    142. beta = Sin(deltaAngle)
    143. For i = 0 To fftSize - 1 Step blockSize
    144. angle = New ComplexDouble(1)
    145. j = i
    146. For n = 0 To blockEnd - 1
    147. k = j + blockEnd
    148. tmp = New ComplexDouble(angle.R * fftOutL(k).R - angle.I * fftOutL(k).I, angle.I * fftOutL(k).R + angle.R * fftOutL(k).I)
    149. fftOutL(k) = fftOutL(j) - tmp
    150. fftOutL(j) += tmp
    151. tmp = New ComplexDouble(angle.R * fftOutR(k).R - angle.I * fftOutR(k).I, angle.I * fftOutR(k).R + angle.R * fftOutR(k).I)
    152. fftOutR(k) = fftOutR(j) - tmp
    153. fftOutR(j) += tmp
    154. angle -= New ComplexDouble(alpha * angle.R + beta * angle.I, alpha * angle.I - beta * angle.R)
    155. j += 1
    156. Next n
    157. Next i
    158. blockEnd = blockSize
    159. blockSize *= 2
    160. Loop While blockSize <= fftSize
    161. If doInverse Then
    162. For i = 0 To fftSize - 1
    163. fftOutL(i).R /= fftSize
    164. fftOutR(i).R /= fftSize
    165. Next i
    166. End If
    167. End Sub
    168. #Region "Other FFT Algorithms"
    169. ' http://www.nicholson.com/dsp.fft1.html
    170. Public Function FFT1r(ByVal doInverse As Boolean, ByVal x() As Double, ByVal m As Integer) As ComplexDouble()
    171. Dim xc(x.Length - 1) As ComplexDouble
    172. For i As Integer = 0 To x.Length - 1
    173. xc(i) = New ComplexDouble(x(i))
    174. Next
    175. Return FFT1r(doInverse, xc, m)
    176. End Function
    177. Public Function FFT1r(ByVal doInverse As Boolean, ByVal x() As ComplexDouble, ByVal m As Integer) As ComplexDouble()
    178. Dim n As Integer = CInt(2 ^ m)
    179. Dim y(n - 1) As ComplexDouble
    180. For i As Integer = 0 To y.Length - 1
    181. y(i) = New ComplexDouble()
    182. Next
    183. Rec_FFT(doInverse, n, x, 0, y, 0, 1, 1)
    184. Return y
    185. End Function
    186. ' *** recursive out-of-place radix-2 FFT ***
    187. Private Sub Rec_FFT(ByVal doInverse As Boolean, ByVal n As Integer, ByVal x() As ComplexDouble, ByVal kx As Integer, ByVal y() As ComplexDouble, ByVal ky As Integer, ByVal ks As Integer, ByVal os As Double)
    188. Dim n2, i As Integer
    189. Dim c, s As Double
    190. Dim k1, k2 As Integer
    191. Dim ar, ai, br, bi As Double
    192. Dim flag As Integer = If(doInverse, -1, 1)
    193. If n = 1 Then
    194. ' ** this does a bit-reversed-index copy and scale **
    195. If doInverse = -1 Then
    196. s = 1 / ks
    197. Else
    198. s = 1
    199. End If
    200. y(ky).R = x(kx).R * s
    201. y(ky).I = x(kx).I * s
    202. Else
    203. n2 = n \ 2
    204. Rec_FFT(flag, n2, x, kx, y, ky, ks * 2, os)
    205. Rec_FFT(flag, n2, x, kx + ks, y, CInt(ky + os * n2), ks * 2, os)
    206. For i = 0 To n2 - 1
    207. c = Cos(i * 2 * PI / n)
    208. s = Sin(i * flag * 2 * PI / n)
    209. k1 = CInt(ky + os * (i))
    210. k2 = CInt(ky + os * (i + n2))
    211. ar = y(k1).R
    212. ai = y(k1).I
    213. br = c * y(k2).R - s * y(k2).I
    214. bi = c * y(k2).I + s * y(k2).R
    215. y(k1).R = ar + br
    216. y(k1).I = ai + bi
    217. y(k2).R = ar - br
    218. y(k2).I = ai - bi
    219. Next i
    220. End If
    221. End Sub
    222. #End Region
    223. Public Function FrequencyOfIndex(ByVal numberOfSamples As Integer, ByVal index As Integer) As Double
    224. If index >= numberOfSamples Then
    225. Return 0.0#
    226. ElseIf index <= numberOfSamples / 2 Then
    227. Return CDbl(index) / CDbl(numberOfSamples)
    228. Else
    229. Return -CDbl(numberOfSamples - index) / CDbl(numberOfSamples)
    230. End If
    231. End Function
    232. Public Sub CalcFrequency(ByVal numberOfSamples As Integer, ByVal frequencyIndex As Integer, ByVal dataIn() As ComplexDouble, ByVal dataOut As ComplexDouble)
    233. Dim cos1 As Double, cos2 As Double, cos3 As Double
    234. Dim sin1 As Double, sin2 As Double, sin3 As Double
    235. Dim beta As Double
    236. Dim theta As Double = 2.0# * PI * frequencyIndex / CDbl(numberOfSamples)
    237. sin1 = Sin(-2.0# * theta)
    238. sin2 = Sin(-theta)
    239. cos1 = Cos(-2.0# * theta)
    240. cos2 = Cos(-theta)
    241. beta = 2 * cos2
    242. For k As Integer = 0 To numberOfSamples - 2
    243. 'Update trig values
    244. sin3 = beta * sin2 - sin1
    245. sin1 = sin2
    246. sin2 = sin3
    247. cos3 = beta * cos2 - cos1
    248. cos1 = cos2
    249. cos2 = cos3
    250. 'dataOut = dataOut + dataIn(k) * cos3 - imagIn(k) * sin3
    251. 'imagOut = imagOut + imagIn(k) * cos3 + dataIn(k) * sin3
    252. dataOut.R += dataIn(k).R * cos3 - dataIn(k).I * sin3
    253. dataOut.I += dataIn(k).I * cos3 + dataIn(k).R * sin3
    254. Next
    255. End Sub
    256. Private Function Bessel(ByVal x As Double) As Double
    257. Dim r As Double = 1
    258. For l As Integer = 0 To 2
    259. r += ((x / 2) ^ (2 * l)) / (Fact(l)) ^ 2
    260. Next l
    261. Return r
    262. End Function
    263. Private Function Fact(ByVal x As Integer) As Integer
    264. Dim n As Integer = 1
    265. For i As Integer = 1 To x
    266. n *= i
    267. Next
    268. Return n
    269. End Function
    270. Public Function HilbertTransform() As Double()
    271. Static isInit As Boolean
    272. Static h(LH) As Double
    273. If Not isInit Then
    274. Dim taper As Double
    275. h(LHHALF) = 0.0
    276. For i As Integer = 1 To LHHALF - 1
    277. taper = 0.54 + 0.46 * Cos(PI * i / LHHALF)
    278. h(LHHALF + i) = taper * (-(i Mod 2) * 2.0 / (PI * (i)))
    279. h(LHHALF - i) = -h(LHHALF + i)
    280. Next
    281. isInit = True
    282. End If
    283. Return h
    284. End Function
    285. Public Function HilbertTransform(ByVal x() As Double)
    286. Return HilbertTransform(ComplexDouble.FromDouble(x))
    287. End Function
    288. Public Function HilbertTransform(ByVal x() As ComplexDouble)
    289. Dim n As Integer = x.Length
    290. Dim z(n - 1) As ComplexDouble
    291. Dim temp As Double
    292. Dim i As Integer
    293. For i = 0 To n - 1
    294. z(i) = New ComplexDouble(x(i).R, 0)
    295. Next
    296. z = FFT1r(False, z, n)
    297. Dim k As Integer = n / 2
    298. z(0).R = 0
    299. z(0).I = 0
    300. z(k).R = 0
    301. z(k).I = 0
    302. For i = 1 To k - 1
    303. temp = z(i).R
    304. z(i).R = -z(i).I
    305. z(i).I = temp
    306. Next
    307. For i = k + 1 To n - 1
    308. temp = -z(i).R
    309. z(i).R = -z(i).I
    310. z(i).I = temp
    311. Next
    312. 'z = FFT1r(True, z, n)
    313. 'For i = 0 To n - 1
    314. ' x(i) = z(i).R
    315. 'Next
    316. Return FFT1r(True, z, n)
    317. End Function
    318. 'Public Sub Convolute(ByVal lx As Integer, ByVal ifx As Integer, ByVal x() As Double, ByVal ly As Integer, ByVal ify As Integer, ByVal y() As Double, ByVal lz As Integer, ByVal ifz As Integer, ByVal z() As Double)
    319. ' ' Very Simple Convolution
    320. ' Dim ilx As Integer = ifx + lx - 1
    321. ' Dim ily As Integer = ify + ly - 1
    322. ' Dim ilz As Integer = ifz + lz - 1
    323. ' Dim jlow As Integer
    324. ' Dim jhigh As Integer
    325. ' Dim sum As Double = 0
    326. ' For i As Integer = ifz To ilz - 1
    327. ' jlow = (i + 1) - ily : If jlow < ifx Then jlow = ifx
    328. ' jhigh = (i + 1) - ify : If jhigh > ilx Then jhigh = ilx
    329. ' For j As Integer = jlow To jhigh - 1
    330. ' sum += x(j + 1 - ifx) * y((i + 1) - (j + 1) - ify)
    331. ' Next
    332. ' z(i + 1 - ifz) = sum
    333. ' Next
    334. 'End Sub
    335. Public Sub Convolute(ByVal data() As Double, ByVal n As Integer, ByVal respns() As Double, ByVal m As Integer, ByVal isign As Integer, ByVal ans() As Double)
    336. Dim i As Integer
    337. Dim no2 As Integer
    338. Dim dum As Double
    339. Dim mag2 As Double
    340. Dim fft() As Double = Vector(Of Double)(1, n << 1)
    341. For i = 1 To (m - 1) \ 2 : respns(n + 1 - i) = respns(m + 1 - i) : Next
    342. For i = (m + 3) \ 2 To n - (m - 1) \ 2 : respns(i) = 0.0 : Next
    343. TwoFFT(data, respns, fft, ans, n)
    344. no2 = n \ 2
    345. For i = 2 To n + 2 Step 2
    346. If isign = 1 Then
    347. dum = ans(i - 1)
    348. ans(i - 1) = (fft(i - 1) * dum - fft(i) * ans(i)) / no2
    349. ans(i) = (fft(i) * dum + fft(i - 1) * ans(i)) / no2
    350. ElseIf isign = -1 Then
    351. mag2 = Sqrt(ans(i - 1)) + Sqrt(ans(i))
    352. If mag2 = 0.0 Then Throw New Exception("Deconvolving at response zero in Convolute")
    353. dum = ans(i - 1)
    354. ans(i - 1) = (fft(i - 1) * dum + fft(i) * ans(i)) / mag2 / no2
    355. ans(i) = (fft(i) * dum - fft(i - 1) * ans(i)) / mag2 / no2
    356. Else
    357. Throw New Exception("No meaning for isign in Convolute")
    358. End If
    359. Next
    360. ans(2) = ans(n + 1)
    361. RealFT(ans, n, -1)
    362. End Sub
    363. Public Function TriangularSmooth(ByVal y() As Double) As Double()
    364. Dim s(y.Length - 1) As Double
    365. For i As Integer = 3 To y.Length - 1 - 2
    366. s(i) = (y(i - 2) + 2 * y(i - 1) + 3 * y(i) + 2 * y(i + 1) + y(i + 2)) / 9
    367. Next
    368. Return s
    369. End Function
    370. 'http://www.fizyka.umk.pl/nrbook/c14-8.pdf (dead link)
    371. 'http://www.vias.org/tmdatanaleng/cc_filter_savgolay.html
    372. 'http://ib.cnea.gov.ar/~fiscom/Libreria/NumRec/C/savgol.c
    373. Public Sub SavitzkyGolay(ByVal c() As Double, ByVal np As Integer, ByVal nl As Integer, ByVal nr As Integer, ByVal ld As Integer, ByVal m As Integer)
    374. Dim imj As Integer
    375. Dim ipj As Integer
    376. Dim j As Integer
    377. Dim k As Integer
    378. Dim kk As Integer
    379. Dim mm As Integer
    380. Dim indx() As Integer
    381. Dim d As Double
    382. Dim fac As Double
    383. Dim sum As Double
    384. Dim a()() As Double
    385. Dim b() As Double
    386. If np < nl + nr + 1 OrElse nl < 0 OrElse nr < 0 OrElse ld > m OrElse nl + nr < m Then
    387. Throw New Exception("Invalid Arguments")
    388. End If
    389. indx = Vector(Of Integer)(1, m + 1)
    390. a = Matrix(1, m + 1, 1, m + 1)
    391. b = Vector(Of Double)(1, m + 1)
    392. For ipj = 0 To 2 * m
    393. sum = If(ipj <> 0, 0.0, 1.0)
    394. For k = 1 To nr : sum += k ^ ipj : Next
    395. For k = 1 To nl : sum += (-k) ^ ipj : Next
    396. mm = Min(ipj, 2 * m - ipj)
    397. For imj = -mm To mm Step 2 : a(1 + (ipj + imj) \ 2)(1 + (ipj - imj) \ 2) = sum : Next
    398. Next
    399. d = Ludcmp(a, m + 1, indx)
    400. For j = 1 To m + 1 : b(j) = 0.0 : Next
    401. b(ld + 1) = 1.0
    402. Lubksb(a, m + 1, indx, b)
    403. For kk = 1 To np : c(kk) = 0.0 : Next
    404. For k = -nl To nr
    405. sum = b(1)
    406. fac = 1.0
    407. For mm = 1 To m
    408. fac *= k
    409. sum += b(mm + 1) * fac
    410. Next
    411. kk = ((np - k) Mod np) + 1
    412. c(kk) = sum
    413. Next
    414. End Sub
    415. #Region "Helper Functions"
    416. Private Const NR_END As Integer = 1
    417. Private Const TINY As Double = Double.MinValue
    418. Private Function Matrix(ByVal nrl As Integer, ByVal nrh As Integer, ByVal ncl As Integer, ByVal nch As Integer) As Double()()
    419. Dim nrow As Integer = nrh - nrl + 1
    420. Dim ncol As Integer = nch - ncl + 1
    421. Dim m(nrow + NR_END)() As Double
    422. For r As Integer = 0 To ncol
    423. ReDim m(r)(nrow * ncol + NR_END)
    424. Next
    425. Return m
    426. End Function
    427. Private Function Vector(Of T)(ByVal nl As Integer, ByVal nh As Integer) As T()
    428. Dim v(nh - nl + 1 + NR_END) As T
    429. Return v
    430. End Function
    431. Private Sub Lubksb(ByVal a()() As Double, ByVal n As Integer, ByVal indx() As Integer, ByVal b() As Double)
    432. Dim i As Integer
    433. Dim ii As Integer = 0
    434. Dim ip As Integer
    435. Dim j As Integer
    436. Dim sum As Double
    437. For i = 1 To n
    438. ip = indx(i)
    439. sum = b(ip)
    440. b(ip) = b(i)
    441. If ii <> 0 Then
    442. For j = ii To i - 1 : sum -= a(i)(j) * b(j) : Next
    443. Else
    444. If sum <> 0 Then ii = i
    445. End If
    446. b(i) = sum
    447. Next
    448. For i = n To 1 Step -1
    449. sum = b(i)
    450. For j = i + 1 To n : sum -= a(i)(j) * b(j) : Next
    451. b(i) = sum / a(i)(i)
    452. Next
    453. End Sub
    454. Private Function Ludcmp(ByVal a As Double()(), ByVal n As Integer, ByVal indx() As Integer) As Double
    455. Dim i As Integer
    456. Dim imax As Integer
    457. Dim j As Integer
    458. Dim k As Integer
    459. Dim big As Double
    460. Dim dum As Double
    461. Dim sum As Double
    462. Dim temp As Double
    463. Dim vv() As Double = Vector(Of Double)(1, n)
    464. Dim d As Double = 1
    465. For i = 1 To n
    466. big = 0.0
    467. For j = 1 To n
    468. temp = Abs(a(i)(j))
    469. If temp > big Then big = temp
    470. Next j
    471. If big = 0.0 Then Throw New Exception("Singular matrix in routine ludcmp")
    472. vv(i) = 1.0 / big
    473. Next
    474. For j = 1 To n
    475. For i = 1 To j - 1
    476. sum = a(i)(j)
    477. For k = 1 To i - 1 : sum -= a(i)(k) * a(k)(j) : Next
    478. a(i)(j) = sum
    479. Next
    480. big = 0.0
    481. For i = j To n
    482. sum = a(i)(j)
    483. For k = 1 To j - 1 : sum -= a(i)(k) * a(k)(j) : Next
    484. a(i)(j) = sum
    485. dum = vv(i) * Abs(sum)
    486. If dum >= big Then
    487. big = dum
    488. imax = i
    489. End If
    490. Next
    491. If j <> imax Then
    492. For k = 1 To n
    493. dum = a(imax)(k)
    494. a(imax)(k) = a(j)(k)
    495. a(j)(k) = dum
    496. Next
    497. d = -d
    498. vv(imax) = vv(j)
    499. End If
    500. indx(j) = imax
    501. If a(j)(j) = 0.0 Then a(j)(j) = TINY
    502. If j <> n Then
    503. dum = 1.0 / a(j)(j)
    504. For i = j + 1 To n : a(i)(j) *= dum : Next
    505. End If
    506. Next
    507. Return d
    508. End Function
    509. Private Sub TwoFFT(ByVal data1() As Double, ByVal data2() As Double, ByVal fft1() As Double, ByVal fft2() As Double, ByVal n As Integer)
    510. Dim nn2 As Integer = 2 + 2 * n
    511. Dim nn3 As Integer = 1 + nn2
    512. Dim jj As Integer = 2
    513. Dim j As Integer
    514. Dim rep As Double
    515. Dim [rem] As Double
    516. Dim aip As Double
    517. Dim aim As Double
    518. For j = 1 To n
    519. fft1(jj - 1) = data1(j)
    520. fft1(jj) = data2(j)
    521. jj += 2
    522. Next
    523. Four1(fft1, n, 1)
    524. fft2(1) = fft1(2)
    525. fft1(2) = 0.0 : fft2(2) = 0.0
    526. For j = 3 To n + 1 Step 2
    527. rep = 0.5 * (fft1(j) + fft1(nn2 - j))
    528. [rem] = 0.5 * (fft1(j) - fft1(nn2 - j))
    529. aip = 0.5 * (fft1(j + 1) + fft1(nn3 - j))
    530. aim = 0.5 * (fft1(j + 1) - fft1(nn3 - j))
    531. fft1(j) = rep
    532. fft1(j + 1) = aim
    533. fft1(nn2 - j) = rep
    534. fft1(nn3 - j) = -aim
    535. fft2(j) = aip
    536. fft2(j + 1) = -[rem]
    537. fft2(nn2 - j) = aip
    538. fft2(nn3 - j) = [rem]
    539. Next
    540. End Sub
    541. Private Sub RealFT(ByVal data() As Double, ByVal n As Integer, ByVal isign As Integer)
    542. Dim i, i1, i2, i3, i4, np3 As Integer
    543. Const c1 As Double = 0.5
    544. Dim c2, h1r, h1i, h2r, h2i As Double
    545. Dim wr, wi, wpr, wpi, wtemp As Double
    546. Dim theta As Double = PI / (n / 2)
    547. If isign = 1 Then
    548. c2 = -0.5
    549. Four1(data, n \ 2, 1)
    550. Else
    551. c2 = 0.5
    552. theta = -theta
    553. End If
    554. wtemp = Sin(0.5 * theta)
    555. wpr = -2.0 * wtemp * wtemp
    556. wpi = Sin(theta)
    557. wr = 1.0 + wpr
    558. wi = wpi
    559. np3 = n + 3
    560. For i = 2 To n \ 4
    561. i1 = 2 * i - 1
    562. i2 = 1 + i1
    563. i3 = np3 - i2
    564. i4 = 1 + i3
    565. h1r = c1 * (data(i1) + data(i3))
    566. h1i = c1 * (data(i2) - data(i4))
    567. h2r = -c2 * (data(i2) + data(i4))
    568. h2i = c2 * (data(i1) - data(i3))
    569. data(i1) = h1r + wr * h2r - wi * h2i
    570. data(i2) = h1i + wr * h2i + wi * h2r
    571. data(i3) = h1r - wr * h2r + wi * h2i
    572. data(i4) = -h1i + wr * h2i + wi * h2r
    573. wtemp = wr
    574. wr = wtemp * wpr - wi * wpi + wr
    575. wi = wi * wpr + wtemp * wpi + wi
    576. Next
    577. If isign = 1 Then
    578. h1r = data(1)
    579. data(1) = h1r + data(2)
    580. data(2) = h1r - data(2)
    581. Else
    582. h1r = data(1)
    583. data(1) = c1 * (h1r + data(2))
    584. data(2) = c1 * (h1r - data(2))
    585. Four1(data, n >> 1, -1)
    586. End If
    587. End Sub
    588. Private Sub Four1(ByVal data() As Double, ByVal nn As Integer, ByVal isign As Integer)
    589. Dim n As Integer = nn * 2
    590. Dim mmax As Integer = 2
    591. Dim m As Integer
    592. Dim j As Integer = 1
    593. Dim istep As Integer
    594. Dim i As Integer
    595. Dim wtemp As Double
    596. Dim wr As Double
    597. Dim wpr As Double
    598. Dim wpi As Double
    599. Dim wi As Double
    600. Dim theta As Double
    601. Dim tempr As Double
    602. Dim tempi As Double
    603. For i = 1 To n - 1 Step 2
    604. If j > i Then
    605. Swap(data(j), data(i))
    606. Swap(data(j + 1), data(i + 1))
    607. End If
    608. m = n \ 2
    609. While m >= 2 AndAlso j > m
    610. j -= m
    611. m \= 2
    612. End While
    613. j += m
    614. Next
    615. While n > mmax
    616. istep = mmax * 2
    617. theta = isign * (2 * PI / mmax)
    618. wtemp = Sin(0.5 * theta)
    619. wpr = -2.0 * wtemp * wtemp
    620. wpi = Sin(theta)
    621. wr = 1.0
    622. wi = 0.0
    623. For m = 1 To mmax - 2 Step 2
    624. For i = m To n - istep Step istep
    625. j = i + mmax
    626. tempr = wr * data(j) - wi * data(j + 1)
    627. tempi = wr * data(j + 1) + wi * data(j)
    628. data(j) = data(i) - tempr
    629. data(j + 1) = data(i + 1) - tempi
    630. data(i) += tempr
    631. data(i + 1) += tempi
    632. Next
    633. wtemp = wr
    634. wr = wtemp * wpr - wi * wpi + wr
    635. wi = wi * wpr + wtemp * wpi + wi
    636. Next
    637. mmax = istep
    638. End While
    639. End Sub
    640. Private Sub Swap(Of T)(ByRef v1 As T, ByRef v2 As T)
    641. Dim tmp As T = v1
    642. v1 = v2
    643. v2 = tmp
    644. End Sub
    645. #End Region
    646. End Module

    xd-franky-5 schrieb:

    Heißt ich habe einen Dateipfad zu einer MP3 und möchte diese nun visualisieren.

    System.Wizard.Magic.Audio.AudioVisualization.CreateVisualization("dein pfad zur mp3", Form1.PictureBox1)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.