rfft — Fast Fourier Transform of a real-value array.
Applies a forward Fast Fourier Transform to a real-value input 1-dimensional array. The output is another array containing the transform, non-redundant, non-negative spectrum only. If the input array is power-of-two, the output array size will match the input size, with the first two points containing 0Hz and Nyquist frequency coefficients. Otherwise, the output will have two extra values (input size + 2), and the the Nyquist coefficient will be placed at kin[input_size] position (kin[1] and kin[input_size+1] will be 0].
kout[] -- output array containing the transform. It will be created if it does not exist.
kin[] -- input array containing the real-valued input.
Here is an example of the rfft opcode. It uses the file rfft.csd.
Example 767. Example of the rfft opcode.
See the sections Real-time Audio and Command Line Flags for more information on using command line flags.
<CsoundSynthesizer> <CsOptions> -d -o dac </CsOptions> <CsInstruments> ;ksmps needs to be an integer div of hopsize ksmps = 64 instr 1 ihopsize = 256 ; hopsize ifftsize = 1024 ; FFT size iolaps = ifftsize/ihopsize ; overlaps ibw = sr/ifftsize ; bin bandwidth kcnt init 0 ; counting vars krow init 0 kOla[] init ifftsize ; overlap-add buffer kIn[] init ifftsize ; input buffer kSw[] init ifftsize kOut[][] init iolaps, ifftsize ; output buffers a1 diskin2 "fox.wav",1,0,1 ; audio input ks expon 100, p3, 1000 asw vco2 k(a1), ks /* every hopsize samples */ if kcnt == ihopsize then /* window and take FFT */ kWin[] window kIn,krow*ihopsize kSpec[] rfft kWin kWin window kSw,krow*ihopsize kSpec2[] rfft kWin kProd[] cmplxprod kSpec, kSpec2 /* IFFT + window */ kRow[] rifft kProd kWin window kRow, krow*ihopsize /* place it on out buffer */ kOut setrow kWin, krow /* zero the ola buffer */ kOla = 0 /* overlap-add */ ki = 0 until ki == iolaps do kRow getrow kOut, ki kOla = kOla + kRow ki += 1 od /* update counters */ krow = (krow+1)%iolaps kcnt = 0 endif /* shift audio in/out of buffers */ kIn shiftin a1 kSw shiftin asw a2 shiftout kOla out a2/iolaps /* increment counter */ kcnt += ksmps endin </CsInstruments> <CsScore> i1 0 10 </CsScore> </CsoundSynthesizer>