Advertisement
jack06215

[numpy] Decompose signal via fft

Jul 3rd, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.07 KB | None | 0 0
  1. import pandas as pd
  2. import dask.dataframe as dd
  3. import numpy as np
  4. import os
  5. from sklearn.datasets import make_classification
  6.  
  7. import matplotlib.pyplot as plt
  8.  
  9. # parameters
  10. n_samples = 20000
  11.  
  12. def decompose_into_n_signals(srs, n):
  13.     fourier = np.fft.rfft(srs)
  14.     frequencies = np.fft.rfftfreq(srs.size, d=2e-2/srs.size)
  15.     out = []
  16.     for vals in np.array_split(frequencies, n):
  17.         ft_threshed = fourier.copy()
  18.         ft_threshed[(vals.min() > frequencies)] = 0
  19.         ft_threshed[(vals.max() < frequencies)] = 0        
  20.         out.append(np.fft.irfft(ft_threshed))
  21.     return out
  22.  
  23. def cut_into_n_bands(srs, n):
  24.     fourier = np.fft.rfft(srs)
  25.     frequencies = np.fft.rfftfreq(srs.size, d=2e-2/srs.size)
  26.     out = []
  27.     for vals in np.array_split(frequencies, n):
  28.         ft_threshed = fourier.copy()
  29.         ft_threshed[(vals.min() > frequencies)] = 0
  30.         ft_threshed[(vals.max() < frequencies)] = 0        
  31.         out.append(ft_threshed.real)
  32.     return out
  33.  
  34. def plot_n_signals(sigs):
  35.     fig, axarr = plt.subplots(len(sigs), figsize=(12, 20))
  36.     for i, sig in enumerate(sigs):
  37.         plt.sca(axarr[i])
  38.         plt.plot(sig)
  39.     plt.gcf().suptitle(f"Decomposition of signal into {len(sigs)} frequency bands", fontsize=24)
  40.  
  41. # features
  42. df = make_classification(n_samples = n_samples, n_features = 10)
  43. df_raw = pd.DataFrame(df[0], columns = ['var1', 'var2', 'var3', 'var4', 'var5', 'var6', 'var7', 'var8', 'var9', 'var10'])
  44.  
  45. # class
  46. df_raw['class'] = df[1]
  47. del df
  48.  
  49. n_signals = 10
  50. plot_n_signals(cut_into_n_bands(df_raw['var1'].values, n_signals))
  51.  
  52. signal_decomposed = decompose_into_n_signals(df_raw['var1'].values, n_signals)
  53. plot_n_signals(signal_decomposed)
  54. plt.figure(figsize=(20,10))
  55. plt.plot(signal_decomposed[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement