include("../src/SoapySDR.jl") using FFTW, DSP, PyPlot, Printf include("fmDemod.jl"); # enumerate devices (kwargs, sz) = SoapySDR.SoapySDRDevice_enumerate() t = unsafe_load(kwargs) for i = 1:Int(sz[]) @printf "\nNumber of results in device = %i\n" t.size @printf "Found device #%d: \n" i keys = unsafe_string.(unsafe_wrap(Array, t.keys, t.size)) vals = unsafe_string.(unsafe_wrap(Array, t.vals, t.size)) for j = 1:t.size @printf " %s = %s\n" keys[j] vals[j] end @printf "\n" end SoapySDR.SoapySDRKwargs_clear(kwargs) # create device instance # args can be user defined or from the enumeration result sdr = SoapySDR.SoapySDRDevice_make(kwargs) # check device is initialized correctly if (unsafe_load(sdr) == C_NULL) @printf "SoapySDRDevice_make fail: %s\n" unsafe_string(SoapySDR.SoapySDRDevice_lastError()) end # query device info # List antennas (name, sz) = SoapySDR.SoapySDRDevice_listAntennas(sdr, SoapySDR.SOAPY_SDR_RX, 0) @printf "Rx antennas: " for i=1:Int(sz[]) @printf "%s, " unsafe_string.(unsafe_wrap(Array, name, Int(sz[])))[i] end @printf "\n" # List gains (name2, sz2) = SoapySDR.SoapySDRDevice_listGains(sdr, SoapySDR.SOAPY_SDR_RX, 0) @printf "Rx gains: " for i=1:Int(sz[]) @printf "%s, " unsafe_string.(unsafe_wrap(Array, name2, Int(sz2[])))[i] end @printf "\n" (ranges, sz) = SoapySDR.SoapySDRDevice_getFrequencyRange(sdr, SoapySDR.SOAPY_SDR_RX, 0) @printf "Rx freq ranges: " for i = 1:Int(sz[]) range = unsafe_wrap(Array, ranges, Int(sz[]))[i] @printf "[%g Hz -> %g Hz], " range.minimum range.maximum end @printf "\n" # apply settings sampRate = 2048e3 if (SoapySDR.SoapySDRDevice_setSampleRate(sdr, SoapySDR.SOAPY_SDR_RX, 0, sampRate) != 0) @printf "setSampleRate fail: %s\n" unsafe_string(SoapySDR.SoapySDRDevice_lastError()) end @printf "Sample rate: %.3f MHz\n" (sampRate/ 1e6) f0 = 104.1e6 if (SoapySDR.SoapySDRDevice_setFrequency(sdr, SoapySDR.SOAPY_SDR_RX, 0, f0) != 0) @printf "setFrequency fail: %s\n" unsafe_string(SoapySDR.SoapySDRDevice_lastError()) end @printf "Center frequency: %.3f MHz\n" (f0/1e6) # create a re-usable buffer for rx samples buffsz = 1024 buff = Array{ComplexF32}(undef, buffsz) # receive some samples timeS = 15 timeSamp = Int(floor(timeS * sampRate / buffsz)) storeIq = zeros(ComplexF32, buffsz*timeSamp) # Parameters for streaming flags = Ref{Cint}() timeNs = Ref{Clonglong}() buffs = [buff] # Array to store IQ data storeBuff = zeros(ComplexF32,timeSamp, buffsz); @printf "Receiving %i seconds of data at %.3f MHz = %i samples\n" timeS (sampRate/1e6) (timeSamp*buffsz) @printf "%i buffers each of size %i" timeSamp buffsz # set up a stream (complex floats) rxStream = SoapySDR.SoapySDRStream() if (SoapySDR.SoapySDRDevice_setupStream(sdr, rxStream, SoapySDR.SOAPY_SDR_RX, SoapySDR.SOAPY_SDR_CF32, C_NULL, 0) != 0) @printf "setupStream fail: %s\n" unsafe_string(SoapySDR.SoapySDRDevice_lastError()) end # start streaming SoapySDR.SoapySDRDevice_activateStream(sdr, rxStream, 0, 0, 0) storeBuff = zeros(ComplexF32,timeSamp, buffsz) for i=1:timeSamp SoapySDR.SoapySDRDevice_readStream(sdr, rxStream, buffs, buffsz, flags, timeNs, 100000) local storeBuff[i,:] = buff end # shutdown the stream SoapySDR.SoapySDRDevice_deactivateStream(sdr, rxStream, 0, 0) # stop streaming SoapySDR.SoapySDRDevice_closeStream(sdr, rxStream); storeFft = zeros(timeSamp, buffsz) for i = 1:size(storeBuff)[1] local storeFft[i,:] = 20 .*log10.(abs.(fftshift(fft(storeBuff[i,:])))) end # get IQ array storeIq = Array(reshape(storeBuff', :, size(storeBuff)[1]*size(storeBuff)[2])')[:]; plotTimeFreq(storeFft, sampRate, f0); (data, fs) = fmDemod(storeIq, sampRate) plotTime(data, fs); wavwrite(data, "demod.wav", Fs=fs) wavplay(data, fs) SoapySDR.SoapySDRDevice_unmake(sdr);