Code: Select all
;OPENS A 16-BIT MONAURAL WAV FILE CONTAINING A SINE WAVE
;DETECTS THE FREQUENCY OF THE SINE WAVE
;READS SAMPLE RATE OF FILE FROM format\nSamplesPerSec
;RUNS IN CONSOLE MODE
;CREATED 8/9/08 by chris319
Global format.WAVEFORMATEX
Global *soundbuffer, bytes_read, real.d, imag.d, frad.d, frequency.d, imd.d, amplitude.d, max_amp.d, peak_freq.d
Global filename$
Global Dim SampleData.d(1)
#PI2 = 2 * #PI
OpenConsole()
Procedure load_wav()
filesize = FileSize(filename$) - 66
*soundbuffer = AllocateMemory(filesize)
ReadFile(1, filename$)
FileSeek(1, 20) ;SKIP HEADERS
ReadData(1, @format, SizeOf(format))
FileSeek(1, 68) ;SKIP HEADERS
bytes_read = ReadData(1, *soundbuffer, filesize)
CloseFile(1)
ReDim SampleData.d(bytes_read / 2)
ct2 = 0
For ct = 0 To bytes_read / 2
SampleData(ct) = PeekW(*soundbuffer + ct2) / 32767 ;READ INTO ARRAY AND NORMALIZE SAMPLE T0 32767
ct2 = ct2 + 2
Next
FreeMemory(*soundbuffer)
EndProcedure
Procedure FFT(frequency)
real.d = 0
imag.d = 0
frad.d = (frequency * #PI2) / format\nSamplesPerSec
samp_ct = 0
;'real' = real part of answer
;'imag' = imaginary part of answer
;'frequency' specifies the frequency you're looking for in radians/sec.
;HERE WE SWEEP THE SAMPLES TO FIGURE OUT THE AMPLITUDE AT THE SPECIFIED FREQUENCY
For sample = 0 To format\nSamplesPerSec
real = real + SampleData(sample) * Sin(frad * samp_ct)
imag = imag + Sin(frad * samp_ct)
samp_ct + 1
Next
;Amount of 'frequency' present is then SquareRoot(real^2 + imag^2)
amplitude.d = Sqr(Pow(real, 2) + Pow(imag, 2))
EndProcedure
Print("Enter name of wav file: "): filename$ = Input(): load_wav()
CreateFile(1, "fft_out.csv")
WriteString(1, "Frequency,Amplitude" + Chr(10))
max_amp = 0
frequency = 100
While frequency <= 20000
FFT(frequency)
If amplitude > max_amp
max_amp = amplitude
peak_freq = frequency
EndIf
WriteString(1, StrD(frequency,0) + "," + StrD(amplitude,4) + Chr(10))
frequency + 100
Wend
CloseFile(1)
PrintN (Chr(10) + "Peak frequency: " + StrD(peak_freq,0) + " Hz" + Chr(10) + Chr(10) + "Done")
here: Delay(250): Goto here
End