def test_wienter_filter_spike(): np.random.seed(0) N = 2048 dt = 0.05 t = dt * np.arange(N) h = np.exp(-0.5 * ((t - 20.) / 1.0)**2) + 10 hN = h + np.random.normal(0, 0.05, size=h.shape) h_smooth = wiener_filter(t, hN) assert_allclose(h, h_smooth, atol=0.03)
def test_wienter_filter_spike(): np.random.seed(0) N = 2048 dt = 0.05 t = dt * np.arange(N) h = np.exp(-0.5 * ((t - 20.) / 1.0) ** 2) + 10 hN = h + np.random.normal(0, 0.05, size=h.shape) h_smooth = wiener_filter(t, hN) assert_allclose(h, h_smooth, atol=0.03)
N = 2000 dt = 0.05 t = dt * np.arange(N) h = np.exp(-0.5 * ((t - 20.) / 1.0)**2) hN = h + np.random.normal(0, 0.5, size=h.shape) Df = 1. / N / dt f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) #------------------------------------------------------------ # Set up the Wiener filter: # fit a model to the PSD consisting of the sum of a # gaussian and white noise h_smooth, PSD, P_S, P_N, Phi = wiener_filter(t, hN, return_PSDs=True) #------------------------------------------------------------ # Use the Savitzky-Golay filter to filter the values h_sg = savitzky_golay(hN, window_size=201, order=4, use_fft=False) #------------------------------------------------------------ # Plot the results N = len(t) Df = 1. / N / (t[1] - t[0]) f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) fig = plt.figure(figsize=(5, 3.75)) fig.subplots_adjust(wspace=0.05, hspace=0.25,
N = 2000 dt = 0.05 t = dt * np.arange(N) h = np.exp(-0.5 * ((t - 20.) / 1.0) ** 2) hN = h + np.random.normal(0, 0.5, size=h.shape) Df = 1. / N / dt f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) #------------------------------------------------------------ # Set up the Wiener filter: # fit a model to the PSD consisting of the sum of a # gaussian and white noise h_smooth, PSD, P_S, P_N, Phi = wiener_filter(t, hN, return_PSDs=True) #------------------------------------------------------------ # Use the Savitzky-Golay filter to filter the values h_sg = savitzky_golay(hN, window_size=201, order=4, use_fft=False) #------------------------------------------------------------ # Plot the results N = len(t) Df = 1. / N / (t[1] - t[0]) f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) fig = plt.figure(figsize=(5, 3.75)) fig.subplots_adjust(wspace=0.05, hspace=0.25, bottom=0.1, top=0.95,
def test_wiener_filter_simple(): t = np.linspace(0, 1, 256) h = np.zeros_like(t) h[::2] = 1000 s = wiener_filter(t, h) assert_allclose(s, np.mean(h))
def compute_Weiner(): from scipy import optimize, fftpack from astroML.filters import savitzky_golay, wiener_filter #---------------------------------------------------------------------- # This function adjusts matplotlib settings for a uniform feel in the textbook. # Note that with usetex=True, fonts are rendered with LaTeX. This may # result in an error if LaTeX is not installed on your system. In that case, # you can set usetex to False. from astroML.plotting import setup_text_plots setup_text_plots(fontsize=8, usetex=False) #------------------------------------------------------------ # Create the noisy data np.random.seed(5) N = 2000 dt = 0.05 t = dt * np.arange(N) h = np.exp(-0.5 * ((t - 20.) / 1.0) ** 2) hN = h + np.random.normal(0, 0.5, size=h.shape) Df = 1. / N / dt f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) #------------------------------------------------------------ # Set up the Wiener filter: # fit a model to the PSD consisting of the sum of a # gaussian and white noise h_smooth, PSD, P_S, P_N, Phi = wiener_filter(t, hN, return_PSDs=True) #------------------------------------------------------------ # Use the Savitzky-Golay filter to filter the values h_sg = savitzky_golay(hN, window_size=201, order=4, use_fft=False) #------------------------------------------------------------ # Plot the results N = len(t) Df = 1. / N / (t[1] - t[0]) f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) HN = fftpack.fft(hN) fig = plt.figure(figsize=(5, 3.75)) fig.subplots_adjust(wspace=0.05, hspace=0.25, bottom=0.1, top=0.95, left=0.12, right=0.95) # First plot: noisy signal ax = fig.add_subplot(221) ax.plot(t, hN, '-', c='gray') ax.plot(t, np.zeros_like(t), ':k') ax.text(0.98, 0.95, "Input Signal", ha='right', va='top', transform=ax.transAxes, bbox=dict(fc='w', ec='none')) ax.set_xlim(0, 90) ax.set_ylim(-0.5, 1.5) ax.xaxis.set_major_locator(plt.MultipleLocator(20)) ax.set_xlabel(r'$\lambda$') ax.set_ylabel('flux') # Second plot: filtered signal ax = plt.subplot(222) ax.plot(t, np.zeros_like(t), ':k', lw=1) ax.plot(t, h_smooth, '-k', lw=1.5, label='Wiener') ax.plot(t, h_sg, '-', c='gray', lw=1, label='Savitzky-Golay') ax.text(0.98, 0.95, "Filtered Signal", ha='right', va='top', transform=ax.transAxes) ax.legend(loc='upper right', bbox_to_anchor=(0.98, 0.9), frameon=False) ax.set_xlim(0, 90) ax.set_ylim(-0.5, 1.5) ax.yaxis.set_major_formatter(plt.NullFormatter()) ax.xaxis.set_major_locator(plt.MultipleLocator(20)) ax.set_xlabel(r'$\lambda$') # Third plot: Input PSD ax = fig.add_subplot(223) ax.scatter(f[:N / 2], PSD[:N / 2], s=9, c='k', lw=0) ax.plot(f[:N / 2], P_S[:N / 2], '-k') ax.plot(f[:N / 2], P_N[:N / 2], '-k') ax.text(0.98, 0.95, "Input PSD", ha='right', va='top', transform=ax.transAxes) ax.set_ylim(-100, 3500) ax.set_xlim(0, 0.9) ax.yaxis.set_major_locator(plt.MultipleLocator(1000)) ax.xaxis.set_major_locator(plt.MultipleLocator(0.2)) ax.set_xlabel('$f$') ax.set_ylabel('$PSD(f)$') # Fourth plot: Filtered PSD ax = fig.add_subplot(224) filtered_PSD = (Phi * abs(HN)) ** 2 ax.scatter(f[:N / 2], filtered_PSD[:N / 2], s=9, c='k', lw=0) ax.text(0.98, 0.95, "Filtered PSD", ha='right', va='top', transform=ax.transAxes) ax.set_ylim(-100, 3500) ax.set_xlim(0, 0.9) ax.yaxis.set_major_locator(plt.MultipleLocator(1000)) ax.yaxis.set_major_formatter(plt.NullFormatter()) ax.xaxis.set_major_locator(plt.MultipleLocator(0.2)) ax.set_xlabel('$f$') plt.show()
def compute_Kernel(): from scipy import optimize, fftpack, interpolate from astroML.fourier import IFT_continuous from astroML.filters import wiener_filter #---------------------------------------------------------------------- # This function adjusts matplotlib settings for a uniform feel in the textbook. # Note that with usetex=True, fonts are rendered with LaTeX. This may # result in an error if LaTeX is not installed on your system. In that case, # you can set usetex to False. from astroML.plotting import setup_text_plots setup_text_plots(fontsize=8, usetex=False) #---------------------------------------------------------------------- # sample the same data as the previous Wiener filter figure np.random.seed(5) t = np.linspace(0, 100, 2001)[:-1] h = np.exp(-0.5 * ((t - 20.) / 1.0) ** 2) hN = h + np.random.normal(0, 0.5, size=h.shape) #---------------------------------------------------------------------- # compute the PSD N = len(t) Df = 1. / N / (t[1] - t[0]) f = fftpack.ifftshift(Df * (np.arange(N) - N / 2)) h_wiener, PSD, P_S, P_N, Phi = wiener_filter(t, hN, return_PSDs=True) #------------------------------------------------------------ # inverse fourier transform Phi to find the effective kernel t_plot, kernel = IFT_continuous(f, Phi) #------------------------------------------------------------ # perform kernel smoothing on the data. This is faster in frequency # space (ie using the standard Wiener filter above) but we will do # it in the slow & simple way here to demonstrate the equivalence # explicitly kernel_func = interpolate.interp1d(t_plot, kernel.real) t_eval = np.linspace(0, 90, 1000) t_KDE = t_eval[:, np.newaxis] - t t_KDE[t_KDE < t_plot[0]] = t_plot[0] t_KDE[t_KDE > t_plot[-1]] = t_plot[-1] F = kernel_func(t_KDE) h_smooth = np.dot(F, hN) / np.sum(F, 1) #------------------------------------------------------------ # Plot the results fig = plt.figure(figsize=(5, 2.2)) fig.subplots_adjust(left=0.1, right=0.95, wspace=0.25, bottom=0.15, top=0.9) # First plot: the equivalent Kernel to the WF ax = fig.add_subplot(121) ax.plot(t_plot, kernel.real, '-k') ax.text(0.95, 0.95, "Effective Wiener\nFilter Kernel", ha='right', va='top', transform=ax.transAxes) ax.set_xlim(-10, 10) ax.set_ylim(-0.05, 0.45) ax.set_xlabel(r'$\lambda$') ax.set_ylabel(r'$K(\lambda)$') # Second axes: Kernel smoothed results ax = fig.add_subplot(122) ax.plot(t_eval, h_smooth, '-k', lw=1) ax.plot(t_eval, 0 * t_eval, '-k', lw=1) ax.text(0.95, 0.95, "Kernel smoothing\nresult", ha='right', va='top', transform=ax.transAxes) ax.set_xlim(0, 90) ax.set_ylim(-0.5, 1.5) ax.set_xlabel('$\lambda$') ax.set_ylabel('flux') plt.show()