def mix_cosines(): """Plots three periods of a mix of cosines. """ # create a SumSignal cos_sig = thinkdsp.CosSignal(freq=440, amp=1.0, offset=0) sin_sig = thinkdsp.SinSignal(freq=880, amp=0.5, offset=0) mix = sin_sig + cos_sig # create a wave wave = mix.make_wave(duration=0.5, start=0, framerate=11025) print('Number of samples', len(wave.ys)) print('Timestep in ms', 1.0 / 11025 * 1000) # select a segment period = mix.period segment = wave.segment(start=0, duration=period*3) # plot the segment thinkplot.preplot(1) segment.plot() thinkplot.Save(root='sounds4', xlabel='Time (s)', axis=[0, period*3, -1.55, 1.55], formats=FORMATS, legend=False)
def plot_filters(close): """Plots the filter that corresponds to diff, deriv, and integral. """ thinkplot.preplot(3, cols=2) diff_window = np.array([1.0, -1.0]) diff_filter = make_filter(diff_window, close) diff_filter.plot(label='diff') deriv_filter = close.make_spectrum() deriv_filter.hs = PI2 * 1j * deriv_filter.fs deriv_filter.plot(label='derivative') thinkplot.config(xlabel='Frequency (1/day)', ylabel='Amplitude ratio', loc='upper left') thinkplot.subplot(2) integ_filter = deriv_filter.copy() integ_filter.hs = 1 / (PI2 * 1j * integ_filter.fs) integ_filter.plot(label='integral') thinkplot.config(xlabel='Frequency (1/day)', ylabel='Amplitude ratio', yscale='log') thinkplot.save('diff_int3')
def three_spectrums(): """Makes a plot showing three spectrums for a sinusoid. """ thinkplot.preplot(rows=1, cols=3) pyplot.subplots_adjust(wspace=0.3, hspace=0.4, right=0.95, left=0.1, top=0.95, bottom=0.05) xticks = range(0, 900, 200) thinkplot.subplot(1) thinkplot.config(xticks=xticks) discontinuity(num_periods=30, hamming=False) thinkplot.subplot(2) thinkplot.config(xticks=xticks) discontinuity(num_periods=30.25, hamming=False) thinkplot.subplot(3) thinkplot.config(xticks=xticks) discontinuity(num_periods=30.25, hamming=True) thinkplot.save(root='windowing1')
def triangle_example(freq): """Makes a figure showing a triangle wave. freq: frequency in Hz """ framerate = 10000 signal = thinkdsp.TriangleSignal(freq) duration = signal.period * 3 segment = signal.make_wave(duration, framerate=framerate) segment.plot() thinkplot.save(root='triangle-%d-1' % freq, xlabel='Time (s)', axis=[0, duration, -1.05, 1.05]) wave = signal.make_wave(duration=0.5, framerate=framerate) spectrum = wave.make_spectrum() thinkplot.preplot(cols=2) spectrum.plot() thinkplot.config(xlabel='Frequency (Hz)', ylabel='Amplitude') thinkplot.subplot(2) spectrum.plot() thinkplot.config(ylim=[0, 500], xlabel='Frequency (Hz)') thinkplot.save(root='triangle-%d-2' % freq)
def main(): # make_figures() wave = thinkdsp.read_wave('28042__bcjordan__voicedownbew.wav') wave.unbias() wave.normalize() track_pitch(wave) return thinkplot.preplot(rows=1, cols=2) plot_shifted(wave, 0.0003) thinkplot.config(xlabel='time (s)', ylabel='amplitude', ylim=[-1, 1]) thinkplot.subplot(2) plot_shifted(wave, 0.00225) thinkplot.config(xlabel='time (s)', ylim=[-1, 1]) thinkplot.save(root='autocorr3')
def plot_sines(): """Makes figures showing correlation of sine waves with offsets. """ wave1 = make_wave(0) wave2 = make_wave(offset=1) thinkplot.preplot(2) wave1.segment(duration=0.01).plot(label='wave1') wave2.segment(duration=0.01).plot(label='wave2') corr_matrix = numpy.corrcoef(wave1.ys, wave2.ys, ddof=0) print(corr_matrix) thinkplot.save(root='autocorr1', xlabel='time (s)', ylabel='amplitude', ylim=[-1.05, 1.05]) offsets = numpy.linspace(0, PI2, 101) corrs = [] for offset in offsets: wave2 = make_wave(offset) corr = corrcoef(wave1.ys, wave2.ys) corrs.append(corr) thinkplot.plot(offsets, corrs) thinkplot.save(root='autocorr2', xlabel='offset (radians)', ylabel='correlation', xlim=[0, PI2], ylim=[-1.05, 1.05])
def chirp_spectrum(): """Plots the spectrum of a one-second one-octave linear chirp. """ signal = thinkdsp.Chirp(start=220, end=440) wave = signal.make_wave(duration=1) thinkplot.preplot(3, cols=3) duration = 0.01 wave.segment(0, duration).plot() thinkplot.config(ylim=[-1.05, 1.05]) thinkplot.subplot(2) wave.segment(0.5, duration).plot() thinkplot.config(yticklabels='invisible', xlabel='Time (s)') thinkplot.subplot(3) wave.segment(0.9, duration).plot() thinkplot.config(yticklabels='invisible') thinkplot.save('chirp3') spectrum = wave.make_spectrum() spectrum.plot(high=700) thinkplot.save('chirp1', xlabel='Frequency (Hz)')
def chirp_spectrum(): """Plots the spectrum of a one-second one-octave linear chirp. """ signal = thinkdsp.Chirp(start=220, end=440) wave = signal.make_wave(duration=1) thinkplot.preplot(3, cols=3) duration = 0.01 wave.segment(0, duration).plot() thinkplot.config(ylim=[-1.05, 1.05]) thinkplot.subplot(2) wave.segment(0.5, duration).plot() thinkplot.config(yticklabels='invisible', xlabel='Time (s)') thinkplot.subplot(3) wave.segment(0.9, duration).plot() thinkplot.config(yticklabels='invisible') thinkplot.save('chirp3') spectrum = wave.make_spectrum() spectrum.plot(high=700) thinkplot.save('chirp1', xlabel='Frequency (Hz)', ylabel='Amplitude')
def window_plot(): """Makes a plot showing a sinusoid, hamming window, and their product. """ signal = thinkdsp.SinSignal(freq=440) duration = signal.period * 10.25 wave1 = signal.make_wave(duration) wave2 = signal.make_wave(duration) ys = np.hamming(len(wave1.ys)) ts = wave1.ts window = thinkdsp.Wave(ys, ts, wave1.framerate) wave2.hamming() thinkplot.preplot(rows=3, cols=1) pyplot.subplots_adjust(wspace=0.3, hspace=0.3, right=0.95, left=0.1, top=0.95, bottom=0.05) thinkplot.subplot(1) wave1.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07]) thinkplot.subplot(2) window.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07]) thinkplot.subplot(3) wave2.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07], xlabel='Time (s)') thinkplot.save(root='windowing2')
def window_plot(): """Makes a plot showing a sinusoid, hamming window, and their product. """ signal = thinkdsp.SinSignal(freq=440) duration = signal.period * 10.25 wave1 = signal.make_wave(duration) wave2 = signal.make_wave(duration) ys = numpy.hamming(len(wave1.ys)) window = thinkdsp.Wave(ys, wave1.framerate) wave2.hamming() thinkplot.preplot(rows=3, cols=1) pyplot.subplots_adjust(wspace=0.3, hspace=0.3, right=0.95, left=0.1, top=0.95, bottom=0.05) thinkplot.subplot(1) wave1.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07]) thinkplot.subplot(2) window.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07]) thinkplot.subplot(3) wave2.plot() thinkplot.config(axis=[0, duration, -1.07, 1.07], xlabel='time (s)') thinkplot.save(root='windowing2')
def segment_violin(start=1.2, duration=0.6): """Load a violin recording and plot its spectrum. start: start time of the segment in seconds duration: in seconds """ wave = thinkdsp.read_wave('92002__jcveliz__violin-origional.wav') # extract a segment segment = wave.segment(start, duration) segment.normalize() # plot the spectrum spectrum = segment.make_spectrum() thinkplot.preplot(1) spectrum.plot(high=10000) thinkplot.Save(root='sounds3', xlabel='Frequency (Hz)', ylabel='Amplitude', formats=FORMATS, legend=False) # print the top 5 peaks peaks = spectrum.peaks() for amp, freq in peaks[:10]: print(freq, amp)
def plot_sincs(): start = 1.0 duration = 0.01 factor = 4 short = wave.segment(start=start, duration=duration) short.plot() sampled = sample(short, factor) sampled.plot_vlines(color='gray') spectrum = sampled.make_spectrum() boxcar = make_boxcar(spectrum, factor) sinc = boxcar.make_wave() sinc.shift(sampled.ts[0]) sinc.roll(len(sinc) // 2) thinkplot.preplot(1) sinc.plot() # CAUTION: don't call plot_sinc_demo with a large wave or it will # fill memory and crash plot_sinc_demo(short, 4) start = short.start + 0.004 duration = 0.00061 plot_sinc_demo(short, 4, start, duration) thinkplot.config(xlim=[start, start + duration], ylim=[-0.05, 0.17], legend=False)
def segment_violin(start=1.2, duration=0.6): """Load a violin recording and plot its spectrum. start: start time of the segment in seconds duration: in seconds """ wave = thinkdsp.read_wave('92002__jcveliz__violin-origional.wav') # extract a segment segment = wave.segment(start, duration) segment.normalize() # plot the spectrum spectrum = segment.make_spectrum() thinkplot.preplot(1) spectrum.plot(high=10000) thinkplot.Save(root='sounds3', xlabel='Frequency (Hz)', ylabel='Amplitude', formats=FORMATS, legend=False) # print the top 5 peaks peaks = spectrum.peaks() for amp, freq in peaks[:10]: print(freq, amp) assert abs(peaks[0][0] - 3762.382899) < 1e-7
def plot_beeps(): wave = thinkdsp.read_wave('253887__themusicalnomad__positive-beeps.wav') wave.normalize() thinkplot.preplot(3) # top left ax1 = plt.subplot2grid((4, 2), (0, 0), rowspan=2) plt.setp(ax1.get_xticklabels(), visible=False) wave.plot() thinkplot.config(title='Input waves', legend=False) # bottom left imp_sig = thinkdsp.Impulses([0.01, 0.4, 0.8, 1.2], amps=[1, 0.5, 0.25, 0.1]) impulses = imp_sig.make_wave(start=0, duration=1.3, framerate=wave.framerate) ax2 = plt.subplot2grid((4, 2), (2, 0), rowspan=2, sharex=ax1) impulses.plot() thinkplot.config(xlabel='Time (s)') # center right convolved = wave.convolve(impulses) ax3 = plt.subplot2grid((4, 2), (1, 1), rowspan=2) plt.title('Convolution') convolved.plot() thinkplot.config(xlabel='Time (s)') thinkplot.save(root='sampling1', formats=FORMATS, legend=False)
def mix_cosines(): """Plots three periods of a mix of cosines. """ # create a SumSignal cos_sig = thinkdsp.CosSignal(freq=440, amp=1.0, offset=0) sin_sig = thinkdsp.SinSignal(freq=880, amp=0.5, offset=0) mix = sin_sig + cos_sig # create a wave wave = mix.make_wave(duration=1.0, start=0, framerate=11025) print('Number of samples', len(wave)) print('Timestep in ms', 1000 / wave.framerate) assert len(wave) == wave.framerate # select a segment period = mix.period segment = wave.segment(start=0, duration=period * 3) # plot the segment thinkplot.preplot(1) segment.plot() thinkplot.Save(root='sounds4', xlabel='Time (s)', axis=[0, period * 3, -1.55, 1.55], formats=FORMATS, legend=False)
def main(): p1 = Hockey() p2 = Hockey() thinkplot.Clf() thinkplot.Pmf(p1) thinkplot.Pmf(p2) thinkplot.Save(root='hockey_self4_prior', xlabel='', ylabel='Probability', formats=['pdf']) p1.UpdateSet([0, 2, 8, 4]) p2.UpdateSet([1, 3, 1, 0]) # p2.UpdateSet([1,3,1,0,1,2,3,4,1,2,2,3,1,2,4,1,3,2,1,1,2,2,1,3,3,1,1,2,4,1,2,1,2,1,4,2,3,1,1]) thinkplot.Clf() thinkplot.preplot(num=2) thinkplot.Pmf(p1) thinkplot.Pmf(p2) thinkplot.Save(root='hockey_self4_posterior', xlabel='', ylabel='Probability', formats=['pdf']) p1 = MakeGoalPmf(p1) p2 = MakeGoalPmf(p2) thinkplot.Clf() thinkplot.preplot(num=2) thinkplot.Pmf(p1) thinkplot.Pmf(p2) thinkplot.Save(root='hockey_self4_MakeGoalPmf', xlabel='', ylabel='Probability', formats=['pdf'])
def plot_response(): thinkplot.preplot(cols=2) response = thinkdsp.read_wave('180961__kleeb__gunshots.wav') response = response.segment(start=0.26, duration=5.0) response.normalize() response.plot() thinkplot.config(xlabel='time', xlim=[0, 5.0], ylabel='amplitude', ylim=[-1.05, 1.05]) thinkplot.subplot(2) transfer = response.make_spectrum() transfer.plot() thinkplot.config(xlabel='frequency', xlim=[0, 22500], ylabel='amplitude') thinkplot.save(root='systems6') wave = thinkdsp.read_wave('92002__jcveliz__violin-origional.wav') wave.ys = wave.ys[:len(response)] wave.normalize() spectrum = wave.make_spectrum() output = (spectrum * transfer).make_wave() output.normalize() wave.plot(color='0.7') output.plot(alpha=0.4) thinkplot.config(xlabel='time', xlim=[0, 5.0], ylabel='amplitude', ylim=[-1.05, 1.05]) thinkplot.save(root='systems7')
def make_figures(): wave1 = make_wave(0) wave2 = make_wave(offset=1) thinkplot.preplot(2) wave1.segment(duration=0.01).plot(label='wave1') wave2.segment(duration=0.01).plot(label='wave2') numpy.corrcoef(wave1.ys, wave2.ys) thinkplot.save(root='autocorr1', xlabel='time (s)', ylabel='amplitude') offsets = numpy.linspace(0, PI2, 101) corrs = [] for offset in offsets: wave2 = make_wave(offset) corr = numpy.corrcoef(wave1.ys, wave2.ys)[0, 1] corrs.append(corr) thinkplot.plot(offsets, corrs) thinkplot.save(root='autocorr2', xlabel='offset (radians)', ylabel='correlation', xlim=[0, PI2])
def aliasing_example(offset=0.000003): """Makes a figure showing the effect of aliasing. """ framerate = 10000 thinkplot.preplot(num=2) freq1 = 4500 signal = thinkdsp.CosSignal(freq1) duration = signal.period*5 segment = signal.make_wave(duration, framerate=framerate) thinkplot.Hlines(0, 0, duration, color='gray') segment.shift(-offset) segment.plot_vlines(label=freq1, linewidth=3) freq2 = 5500 signal = thinkdsp.CosSignal(freq2) segment = signal.make_wave(duration, framerate=framerate) segment.shift(+offset) segment.plot_vlines(label=freq2, linewidth=3) thinkplot.save(root='aliasing1', xlabel='Time (s)', axis=[-0.00002, duration, -1.05, 1.05] )
def plot_derivative(wave, wave2): # compute the derivative by spectral decomposition spectrum = wave.make_spectrum() spectrum3 = wave.make_spectrum() spectrum3.differentiate() # plot the derivative computed by diff and differentiate wave3 = spectrum3.make_wave() wave2.plot(color="0.7", label="diff") wave3.plot(label="derivative") thinkplot.config(xlabel="days", xlim=[0, 1650], ylabel="dollars", loc="upper left") thinkplot.save(root="systems4") # plot the amplitude ratio compared to the diff filter amps = spectrum.amps amps3 = spectrum3.amps ratio3 = amps3 / amps thinkplot.preplot(1) thinkplot.plot(ratio3, label="ratio") window = numpy.array([1.0, -1.0]) padded = zero_pad(window, len(wave)) fft_window = numpy.fft.rfft(padded) thinkplot.plot(abs(fft_window), color="0.7", label="filter") thinkplot.config( xlabel="frequency (1/days)", xlim=[0, 1650 / 2], ylabel="amplitude ratio", ylim=[0, 4], loc="upper left" ) thinkplot.save(root="systems5")
def plot_sincs(): start = 1.0 duration = 0.01 factor = 4 short = wave.segment(start=start, duration=duration) short.plot() sampled = sample(short, factor) sampled.plot_vlines(color='gray') spectrum = sampled.make_spectrum() boxcar = make_boxcar(spectrum, factor) sinc = boxcar.make_wave() sinc.shift(sampled.ts[0]) sinc.roll(len(sinc)//2) thinkplot.preplot(1) sinc.plot() # CAUTION: don't call plot_sinc_demo with a large wave or it will # fill memory and crash plot_sinc_demo(short, 4) start = short.start + 0.004 duration = 0.00061 plot_sinc_demo(short, 4, start, duration) thinkplot.config(xlim=[start, start+duration], ylim=[-0.05, 0.17], legend=False)
def plot_response(): thinkplot.preplot(cols=2) response = thinkdsp.read_wave("180961__kleeb__gunshots.wav") response = response.segment(start=0.26, duration=5.0) response.normalize() response.plot() thinkplot.config(xlabel="time", xlim=[0, 5.0], ylabel="amplitude", ylim=[-1.05, 1.05]) thinkplot.subplot(2) transfer = response.make_spectrum() transfer.plot() thinkplot.config(xlabel="frequency", xlim=[0, 22500], ylabel="amplitude") thinkplot.save(root="systems6") wave = thinkdsp.read_wave("92002__jcveliz__violin-origional.wav") wave.ys = wave.ys[: len(response)] wave.normalize() spectrum = wave.make_spectrum() output = (spectrum * transfer).make_wave() output.normalize() wave.plot(color="0.7") output.plot(alpha=0.4) thinkplot.config(xlabel="time", xlim=[0, 5.0], ylabel="amplitude", ylim=[-1.05, 1.05]) thinkplot.save(root="systems7")
def aliasing_example(offset=0.000003): """Makes a figure showing the effect of aliasing. """ framerate = 10000 def plot_segment(freq): signal = thinkdsp.CosSignal(freq) duration = signal.period*4 thinkplot.Hlines(0, 0, duration, color='gray') segment = signal.make_wave(duration, framerate=framerate*10) segment.plot(linewidth=0.5, color='gray') segment = signal.make_wave(duration, framerate=framerate) segment.plot_vlines(label=freq, linewidth=4) thinkplot.preplot(rows=2) plot_segment(4500) thinkplot.config(axis=[-0.00002, 0.0007, -1.05, 1.05]) thinkplot.subplot(2) plot_segment(5500) thinkplot.config(axis=[-0.00002, 0.0007, -1.05, 1.05]) thinkplot.save(root='aliasing1', xlabel='Time (s)', formats=FORMATS)
def triangle_example(freq): """Makes a figure showing a triangle wave. freq: frequency in Hz """ framerate = 10000 signal = thinkdsp.TriangleSignal(freq) duration = signal.period*3 segment = signal.make_wave(duration, framerate=framerate) segment.plot() thinkplot.save(root='triangle-%d-1' % freq, xlabel='Time (s)', axis=[0, duration, -1.05, 1.05]) wave = signal.make_wave(duration=0.5, framerate=framerate) spectrum = wave.make_spectrum() thinkplot.preplot(cols=2) spectrum.plot() thinkplot.config(xlabel='Frequency (Hz)', ylabel='Amplitude') thinkplot.subplot(2) spectrum.plot() thinkplot.config(ylim=[0, 500], xlabel='Frequency (Hz)') thinkplot.save(root='triangle-%d-2' % freq)
def main(): thinkdsp.random_seed(19) signal = thinkdsp.BrownianNoise() make_periodogram(signal) return signal = thinkdsp.UncorrelatedUniformNoise() wave1 = signal.make_wave(duration=1.0, framerate=11025) wave2 = signal.make_wave(duration=1.0, framerate=11025) print wave1.cov(wave2) print wave1.cov(wave1) print wave2.cov(wave2) print wave1.cov_mat(wave2) print wave1.corr(wave2) print wave1.corr(wave1) print wave2.corr(wave2) return signal = thinkdsp.BrownianNoise() process_noise(signal, root='red') return signal = thinkdsp.UncorrelatedUniformNoise() process_noise(signal, root='white') return signal = thinkdsp.WhiteNoise() white, integ_white = test_noise(signal, 'white-noise') print white.estimate_slope() signal = thinkdsp.BrownianNoise() red, integ_red = test_noise(signal, 'red-noise') print red.estimate_slope() return signal = thinkdsp.PinkNoise(beta=1.0) pink, integ_pink = test_noise(signal, 'pink-noise') print pink.estimate_slope() thinkplot.preplot(num=3) white.plot(low=1, exponent=2, label='white', linewidth=2) pink.plot(low=1, exponent=2, label='pink', linewidth=2) red.plot(low=1, exponent=2, label='red', linewidth=2) thinkplot.show(xlabel='frequency (Hz)', ylabel='power', xscale='log', yscale='log', axis=[1, 18000, 1e-5, 1e8]) return
def main(): p1 = Hockey() p2 = Hockey() p1.UpdateSet([0,2,8,4]) p2.UpdateSet([1,3,1,0]) thinkplot.Clf() thinkplot.preplot(num=2) thinkplot.Pmf(p1) thinkplot.Pmf(p2) thinkplot.Save(root='hockey_self3',xlabel='',ylabel='Probability',formats=['pdf'])
def compute_corr(offset): wave1 = make_sine(offset=0) wave2 = make_sine(offset=-offset) thinkplot.preplot(2) wave1.segment(duration=0.01).plot() wave2.segment(duration=0.01).plot() corr = wave1.corr(wave2) print('corr =', corr) thinkplot.config(xlabel='Time (s)', ylim=[-1.05, 1.05])
def plot_shifted(wave, shift=0.002, start=0.2): thinkplot.preplot(num=2) segment1 = wave.segment(start=start, duration=0.01) segment1.plot(linewidth=2, alpha=0.8) segment2 = wave.segment(start=start-shift, duration=0.01) segment2.plot(linewidth=2, alpha=0.4) corr = segment1.corr(segment2) text = r'$\rho =$ %.2g' % corr thinkplot.text(0.0005, -0.8, text)
def process_noise(signal, root='white'): """Plots wave and spectrum for noise signals. signal: Signal root: string used to generate file names """ framerate = 11025 wave = signal.make_wave(duration=0.5, framerate=framerate) # 0: waveform segment = wave.segment(duration=0.1) segment.plot(linewidth=1, alpha=0.5) thinkplot.save(root=root+'noise0', xlabel='Time (s)', ylim=[-1.05, 1.05]) spectrum = wave.make_spectrum() # 1: spectrum spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.save(root=root+'noise1', xlabel='Frequency (Hz)', ylabel='Power', xlim=[0, spectrum.fs[-1]]) slope, _, _, _, _ = spectrum.estimate_slope() print('estimated slope', slope) # 2: integrated spectrum integ = spectrum.make_integrated_spectrum() integ.plot_power() thinkplot.save(root=root+'noise2', xlabel='Frequency (Hz)', ylabel='Cumulative fraction of total power', xlim=[0, framerate/2]) # 3: log-log power spectrum spectrum.hs[0] = 0 thinkplot.preplot(cols=2) spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.config(xlabel='Frequency (Hz)', ylabel='Power', xlim=[0, framerate/2]) thinkplot.subplot(2) spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.config(xlabel='Frequency (Hz)', xscale='log', yscale='log', xlim=[0, framerate/2]) thinkplot.save(root=root+'noise3')
def plot_diff_deriv(close): change = thinkdsp.Wave(np.diff(close.ys), framerate=1) deriv_spectrum = close.make_spectrum().differentiate() deriv = deriv_spectrum.make_wave() low, high = 0, 50 thinkplot.preplot(2) thinkplot.plot(change.ys[low:high], label='diff') thinkplot.plot(deriv.ys[low:high], label='derivative') thinkplot.config(xlabel='Time (day)', ylabel='Price change ($)') thinkplot.save('diff_int4')
def main(): locomotiveNumbers = range(1, 1001) locomotive = Locomotive(locomotiveNumbers) locomotive.Update(60) locomotive.Update(160) locomotive.Update(80) locomotive.Update(570) locomotive.Update(640) print('Mean: {}'.format(locomotive.Mean())) thinkplot.preplot(1) thinkplot.Pmf(locomotive) thinkplot.show(xlabel='Number of train', ylabel='Probability')
def plot_wave_and_spectrum(wave, root): """Makes a plot showing """ thinkplot.preplot(cols=2) wave.plot() thinkplot.config(xlabel="days", xlim=[0, 1650], ylabel="dollars", legend=False) thinkplot.subplot(2) spectrum = wave.make_spectrum() print(spectrum.estimate_slope()) spectrum.plot() thinkplot.config(xlabel="frequency (1/days)", ylabel="power", xscale="log", yscale="log", legend=False) thinkplot.save(root=root)
def plot_shifted(wave, offset=0.001, start=0.2): thinkplot.preplot(2) segment1 = wave.segment(start=start, duration=0.01) segment1.plot(linewidth=2, alpha=0.8) # start earlier and then shift times to line up segment2 = wave.segment(start=start-offset, duration=0.01) segment2.shift(offset) segment2.plot(linewidth=2, alpha=0.4) corr = segment1.corr(segment2) text = r'$\rho =$ %.2g' % corr thinkplot.text(segment1.start+0.0005, -0.8, text) thinkplot.config(xlabel='Time (s)', xlim=[start, start+duration], ylim=[-1, 1])
def process_noise(signal, root='white'): """Plots wave and spectrum for noise signals. signal: Signal root: string used to generate file names """ framerate = 48000 wave = signal.make_wave(duration=0.5, framerate=framerate) # 0: waveform segment = wave.segment(duration=0.1) segment.plot(linewidth=1, alpha=0.5) thinkplot.save(root=root + 'noise0', xlabel='Time (s)', ylim=[-1.05, 1.05]) spectrum = wave.make_spectrum() # 1: spectrum spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.save(root=root + 'noise1', xlabel='Frequency (Hz)', ylabel='Power', xlim=[0, spectrum.fs[-1]]) slope, _, _, _, _ = spectrum.estimate_slope() print('estimated slope', slope) # 2: integrated spectrum integ = spectrum.make_integrated_spectrum() integ.plot_power() thinkplot.save(root=root + 'noise2', xlabel='Frequency (Hz)', ylabel='Cumulative fraction of total power', xlim=[0, framerate / 2]) # 3: log-log power spectrum spectrum.hs[0] = 0 thinkplot.preplot(cols=2) spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.config(xlabel='Frequency (Hz)', ylabel='Power', xlim=[0, framerate / 2]) thinkplot.subplot(2) spectrum.plot_power(linewidth=1, alpha=0.5) thinkplot.config(xlabel='Frequency (Hz)', xscale='log', yscale='log', xlim=[0, framerate / 2]) thinkplot.save(root=root + 'noise3')
def plot_autocorr(): """Plots autocorrelation for pink noise with different parameters """ numpy.random.seed(19) thinkplot.preplot(3) for beta in [1.2, 1.0, 0.7]: label = r'$\beta$ = %.1f' % beta plot_pink_autocorr(beta, label) thinkplot.config(xlabel='lag', ylabel='correlation', xlim=[-1, 200], ylim=[-0.05, 1.05]) thinkplot.save(root='autocorr4')
def plot_sawtooth_and_spectrum(wave, root): """Makes a plot showing a sawtoothwave and its spectrum. """ thinkplot.preplot(cols=2) wave.plot() thinkplot.config(xlabel='Time (s)') thinkplot.subplot(2) spectrum = wave.make_spectrum() spectrum.plot() thinkplot.config(xlabel='Frequency (Hz)', ylabel='Amplitude', xlim=[0, spectrum.fs[-1]]) thinkplot.save(root)
def overlapping_windows(): """Makes a figure showing overlapping hamming windows. """ n = 256 window = np.hamming(n) thinkplot.preplot(num=5) start = 0 for i in range(5): xs = np.arange(start, start + n) thinkplot.plot(xs, window) start += n / 2 thinkplot.save(root='windowing3', xlabel='Index', axis=[0, 800, 0, 1.05])
def overlapping_windows(): """Makes a figure showing overlapping hamming windows. """ n = 256 window = numpy.hamming(n) thinkplot.preplot(num=5) start = 0 for i in range(5): xs = numpy.arange(start, start + n) thinkplot.plot(xs, window) start += n / 2 thinkplot.save(root="windowing3", xlabel="time (s)", axis=[0, 800, 0, 1.05])
def make_figures(): """Makes figures showing complex signals. """ amps = numpy.array([0.6, 0.25, 0.1, 0.05]) freqs = [100, 200, 300, 400] framerate = 11025 ts = numpy.linspace(0, 1, framerate) ys = synthesize1(amps, freqs, ts) print(ys) thinkplot.preplot(2) n = framerate / 25 thinkplot.plot(ts[:n], ys[:n].real, label='real') thinkplot.plot(ts[:n], ys[:n].imag, label='imag') thinkplot.save(root='dft1', xlabel='time (s)', ylabel='wave', ylim=[-1.05, 1.05]) ys = synthesize2(amps, freqs, ts) amps2 = amps * numpy.exp(1.5j) ys2 = synthesize2(amps2, freqs, ts) thinkplot.preplot(2) thinkplot.plot(ts[:n], ys.real[:n], label=r'$\phi_0 = 0$') thinkplot.plot(ts[:n], ys2.real[:n], label=r'$\phi_0 = 1.5$') thinkplot.save(root='dft2', xlabel='time (s)', ylabel='wave', ylim=[-1.05, 1.05], loc='lower right') framerate = 10000 signal = thinkdsp.SawtoothSignal(freq=500) wave = signal.make_wave(duration=0.1, framerate=framerate) hs = dft(wave.ys) amps = numpy.absolute(hs) N = len(hs) fs = numpy.arange(N) * framerate / N thinkplot.plot(fs, amps) thinkplot.save(root='dft3', xlabel='frequency (Hz)', ylabel='amplitude', legend=False)
def plot_sincs(wave): start = 1.0 duration = 0.01 factor = 4 short = wave.segment(start=start, duration=duration) #short.plot() sampled = sample(short, factor) #sampled.plot_vlines(color='gray') spectrum = sampled.make_spectrum(full=True) boxcar = make_boxcar(spectrum, factor) sinc = boxcar.make_wave() sinc.shift(sampled.ts[0]) sinc.roll(len(sinc)//2) thinkplot.preplot(2, cols=2) sinc.plot() thinkplot.config(xlabel='Time (s)') thinkplot.subplot(2) boxcar.plot() thinkplot.config(xlabel='Frequency (Hz)', ylim=[0, 1.05], xlim=[-boxcar.max_freq, boxcar.max_freq]) thinkplot.save(root='sampling6', formats=FORMATS) return # CAUTION: don't call plot_sinc_demo with a large wave or it will # fill memory and crash plot_sinc_demo(short, 4) thinkplot.config(xlabel='Time (s)') thinkplot.save(root='sampling7', formats=FORMATS) start = short.start + 0.004 duration = 0.00061 plot_sinc_demo(short, 4, start, duration) thinkplot.config(xlabel='Time (s)', xlim=[start, start+duration], ylim=[-0.06, 0.17], legend=False) thinkplot.save(root='sampling8', formats=FORMATS)
def plot_amen2(): wave = thinkdsp.read_wave('263868__kevcio__amen-break-a-160-bpm.wav') wave.normalize() ax1 = thinkplot.preplot(6, rows=4) wave.make_spectrum(full=True).plot(label='spectrum') xlim = [-22050-250, 22050] thinkplot.config(xlim=xlim, xticklabels='invisible') ax2 = thinkplot.subplot(2) impulses = make_impulses(wave, 4) impulses.make_spectrum(full=True).plot(label='impulses') thinkplot.config(xlim=xlim, xticklabels='invisible') ax3 = thinkplot.subplot(3) sampled = wave * impulses spectrum = sampled.make_spectrum(full=True) spectrum.plot(label='sampled') thinkplot.config(xlim=xlim, xticklabels='invisible') ax4 = thinkplot.subplot(4) spectrum.low_pass(5512.5) spectrum.plot(label='filtered') thinkplot.config(xlim=xlim, xlabel='Frequency (Hz)') thinkplot.save(root='sampling4', formats=FORMATS)
def plot_integral(close): deriv_spectrum = close.make_spectrum().differentiate() integ_spectrum = deriv_spectrum.integrate() print(integ_spectrum.hs[0]) integ_spectrum.hs[0] = 0 thinkplot.preplot(2) integ_wave = integ_spectrum.make_wave() close.plot(label='closing prices') integ_wave.plot(label='integrated derivative') thinkplot.config(xlabel='Time (day)', ylabel='Price ($)', legend=True, loc='upper left') thinkplot.save('diff_int5')
def main(): h1 = Hockey() h2 = Hockey() h1.UpdateSet([0, 2, 8, 4]) h2.UpdateSet([0, 1, 2, 3]) h1 = MakeGoalPmf(h1) h2 = MakeGoalPmf(h2) thinkplot.Clf() thinkplot.preplot(num=2) thinkplot.Pmf(h1) thinkplot.Pmf(h2) thinkplot.Save(root='hockey_self5_MakeGoalPmf', xlabel='', ylabel='Probability', formats=['pdf'])
def plot_amen2(): wave = thinkdsp.read_wave('263868__kevcio__amen-break-a-160-bpm.wav') wave.normalize() ax1 = thinkplot.preplot(6, rows=4) wave.make_spectrum(full=True).plot(label='spectrum') xlim = [-22050 - 250, 22050] thinkplot.config(xlim=xlim, xticklabels='invisible') ax2 = thinkplot.subplot(2) impulses = make_impulses(wave, 4) impulses.make_spectrum(full=True).plot(label='impulses') thinkplot.config(xlim=xlim, xticklabels='invisible') ax3 = thinkplot.subplot(3) sampled = wave * impulses spectrum = sampled.make_spectrum(full=True) spectrum.plot(label='sampled') thinkplot.config(xlim=xlim, xticklabels='invisible') ax4 = thinkplot.subplot(4) spectrum.low_pass(5512.5) spectrum.plot(label='filtered') thinkplot.config(xlim=xlim, xlabel='Frequency (Hz)') thinkplot.save(root='sampling4', formats=FORMATS)
def plot_diff_filters(wave): window1 = np.array([1, -1]) window2 = np.array([-1, 4, -3]) / 2.0 window3 = np.array([2, -9, 18, -11]) / 6.0 window4 = np.array([-3, 16, -36, 48, -25]) / 12.0 window5 = np.array([12, -75, 200, -300, 300, -137]) / 60.0 thinkplot.preplot(5) for i, window in enumerate([window1, window2, window3, window4, window5]): padded = thinkdsp.zero_pad(window, len(wave)) fft_window = np.fft.rfft(padded) n = len(fft_window) thinkplot.plot(abs(fft_window)[:], label=i + 1) thinkplot.show()
def plot_diff_filters(wave): window1 = np.array([1, -1]) window2 = np.array([-1, 4, -3]) / 2.0 window3 = np.array([2, -9, 18, -11]) / 6.0 window4 = np.array([-3, 16, -36, 48, -25]) / 12.0 window5 = np.array([12, -75, 200, -300, 300, -137]) / 60.0 thinkplot.preplot(5) for i, window in enumerate([window1, window2, window3, window4, window5]): padded = thinkdsp.zero_pad(window, len(wave)) fft_window = np.fft.rfft(padded) n = len(fft_window) thinkplot.plot(abs(fft_window)[:], label=i+1) thinkplot.show()
def show_impulses(wave, factor, i): thinkplot.subplot(i) thinkplot.preplot(2) impulses = make_impulses(wave, factor) impulses.segment(0, 0.001).plot_vlines(linewidth=2, xfactor=1000) if i == 1: thinkplot.config(title='Impulse train', ylim=[0, 1.05]) else: thinkplot.config(xlabel='Time (ms)', ylim=[0, 1.05]) thinkplot.subplot(i + 1) impulses.make_spectrum(full=True).plot() kill_yticklabels() if i == 1: thinkplot.config(title='DFT of impulse train', xlim=[-22400, 22400]) else: thinkplot.config(xlabel='Frequency (Hz)', xlim=[-22400, 22400])
def plot_shifted(wave, shift=0.002, start=0.2): """Plots two segments of a wave with different start times. wave: Wave shift: difference in start time (seconds) start: start time in seconds """ thinkplot.preplot(num=2) segment1 = wave.segment(start=start, duration=0.01) segment1.plot(linewidth=2, alpha=0.8) segment2 = wave.segment(start=start-shift, duration=0.01) segment2.plot(linewidth=2, alpha=0.4) corr = segment1.corr(segment2) text = r'$\rho =$ %.2g' % corr thinkplot.text(0.0005, -0.8, text) thinkplot.config(xlabel='time (s)', ylim=[-1, 1])
def plot_shifted(wave, shift=0.002, start=0.2): """Plots two segments of a wave with different start times. wave: Wave shift: difference in start time (seconds) start: start time in seconds """ thinkplot.preplot(num=2) segment1 = wave.segment(start=start, duration=0.01) segment1.plot(linewidth=2, alpha=0.8) segment2 = wave.segment(start=start - shift, duration=0.01) segment2.plot(linewidth=2, alpha=0.4) corr = segment1.corr(segment2) text = r'$\rho =$ %.2g' % corr thinkplot.text(0.0005, -0.8, text) thinkplot.config(xlabel='time (s)', ylim=[-1, 1])
def plot_gaussian(): """Makes a plot showing the effect of convolution with a boxcar window. """ # start with a square signal signal = thinkdsp.SquareSignal(freq=440) wave = signal.make_wave(duration=1, framerate=44100) spectrum = wave.make_spectrum() # and a boxcar window boxcar = np.ones(11) boxcar /= sum(boxcar) # and a gaussian window gaussian = scipy.signal.gaussian(M=11, std=2) gaussian /= sum(gaussian) thinkplot.preplot(2) thinkplot.plot(boxcar, label='boxcar') thinkplot.plot(gaussian, label='Gaussian') thinkplot.config(xlabel='Index', legend=True) thinkplot.save(root='convolution7') ys = np.convolve(wave.ys, gaussian, mode='same') smooth = thinkdsp.Wave(ys, framerate=wave.framerate) spectrum2 = smooth.make_spectrum() # plot the ratio of the original and smoothed spectrum amps = spectrum.amps amps2 = spectrum2.amps ratio = amps2 / amps ratio[amps<560] = 0 # plot the same ratio along with the FFT of the window padded = thinkdsp.zero_pad(gaussian, len(wave)) dft_gaussian = np.fft.rfft(padded) thinkplot.plot(abs(dft_gaussian), color=GRAY, label='Gaussian filter') thinkplot.plot(ratio, label='amplitude ratio') thinkplot.config(xlabel='Frequency (Hz)', ylabel='Amplitude ratio', xlim=[0, 22050]) thinkplot.save(root='convolution8')