Sha256: f75392092e82e850f74ba060cc2d2448b3750797ef0af45cd59f122e1fce4e9d

Contents?: true

Size: 1.84 KB

Versions: 7

Compression:

Stored size: 1.84 KB

Contents

plt = Digiproc::QuickPlot
prob = Digiproc::Probability
norm_dist = Digiproc::Probability::RealizedGaussianDistribution
window = BlackmanWindow.new(size: 16384)

#************ Find a signal in noise with FFT ****************

#sample every 1 ms
sample_rate = 0.001
datapoints = 16384 # use a power of 2 because FFT uses Radix 2 algorithm
#300Hz and 500Hz signals
signal = Digiproc::AnalogSignal.new(eqn: ->(t){0.2 * Math.cos(2*Math::PI * 300 * t) + 0.3 * Math.cos(2 * Math::PI * 400 * t)}, sample_rate: sample_rate, size: datapoints).to_ds
data = signal.data
noise = norm_dist.new(mean: 0, stddev: 1, size: datapoints)
#Add signal to noise data
recieved_signal = data.plus(noise.data)

#process signal with a blackman window (below shows that this is an optional step)
processed_signal_data = recieved_signal.times window.data

processed_signal = Digiproc::DigitalSignal.new(data: processed_signal_data)

fft = processed_signal.fft

#Get the 
signal_locations = fft.maxima(4)

puts signal_locations

max_freq_hz = 0.5 / sample_rate
max_freq_datapoint = datapoints / 2

# Only use signals below Nyquist Frequency
signal_locations.select!{ |location| location.index < max_freq_datapoint }

signal_1_freq = signal_locations[0].index.to_f / max_freq_datapoint * max_freq_hz
signal_2_freq = signal_locations[1].index.to_f / max_freq_datapoint * max_freq_hz

puts "Most powerful signal at #{signal_1_freq} Hz"
puts "Second most powerful signal at #{signal_2_freq} Hz"

#Signal not viewable in time domain
plt.plot(data: recieved_signal, title: "Recieved data (time domain)", path: './examples/fft/' )
#Signal easily viewed in frequency domain (dB plot)
fft.plot_db(path: "./examples/fft/")
#plot unprocessed signal dB
plt.plot(data: Digiproc::DigitalSignal.new(data: recieved_signal).fft.dB , title: "Unprocessed FFT", path: './examples/fft/')

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
digiproc-0.2.5 examples/fft/simple_fft_example.rb
digiproc-0.2.4 examples/fft/simple_fft_example.rb
digiproc-0.2.3 examples/fft/simple_fft_example.rb
digiproc-0.2.2 examples/fft/simple_fft_example.rb
digiproc-0.2.1 examples/fft/simple_fft_example.rb
digiproc-0.2.0 examples/fft/simple_fft_example.rb
digiproc-0.1.0 examples/fft/simple_fft_example.rb