import numpy as np import matplotlib.pyplot as plt import librosa from sklearn.decomposition import TruncatedSVD from scipy.linalg import svd, polar import pandas as pd def load_signal_from_csv(csv_file_path): csv_data = pd.read_csv(csv_file_path, header=None, names=['Values']) y = csv_data['Values'].to_numpy() return y def create_spectrogram(y, n_fft=1024, hop_length=2, win_length=128): stft = librosa.stft(y, n_fft=n_fft, hop_length=hop_length, win_length=win_length) spectrogram = np.abs(stft) stft_real = stft.real spectrogram_db = librosa.amplitude_to_db(spectrogram, ref=np.max) N = spectrogram_db.shape[0] # Visualize the spectrogram fig, ax = plt.subplots(figsize=(10, 5)) img = librosa.display.specshow(spectrogram_db, x_axis='time', y_axis='hz', fmin=0, fmax=17000, ax=ax) ax.set_title('Spectrogram', fontsize=20) fig.colorbar(img, ax=ax, format='%0.002f') plt.show() return spectrogram, stft_real def create_pca(stft_real): covX = np.dot(stft_real.T, stft_real) d, V = np.linalg.eig(covX) Xpca = np.real(np.dot(stft_real, V[:, :2])) fig, axs = plt.subplots(2, 1, figsize=(12, 10)) axs[0].semilogy(np.abs(d), '.') axs[0].grid() axs[1].plot(Xpca[:, 0], Xpca[:, 1], '.k') axs[1].grid() # Create a new figure for PCA results plt.figure(figsize=(12, 5)) plt.plot(Xpca[:, 0], Xpca[:, 1], '.k') plt.axhline(y=2, color='r', linestyle='--', xmin=0, xmax=1) plt.axhline(y=-2, color='r', linestyle='--', xmin=0, xmax=1) plt.title("PCA Lehce klepe s hranicemi") plt.grid() plt.savefig('PCA Clustering Light Knocking (Separate)') plt.show() plt.show() return Xpca def create_svd(stft_real): svd_model = TruncatedSVD(n_components=2, n_iter=7, random_state=50) Xsvd = svd_model.fit_transform(stft_real) plt.figure(figsize=(12, 5)) plt.plot(Xsvd[:, 0], Xsvd[:, 1], '.k') plt.title("SVD Results") plt.axhline(y=2, color='r', linestyle='--', xmin=0, xmax=1) plt.axhline(y=-2, color='r', linestyle='--', xmin=0, xmax=1) plt.grid() plt.show() return Xsvd def Borders_PCA_SVD(Xpca, Xsvd, pca_upper_bound=2, pca_lower_bound=-2, svd_upper_bound=2, svd_lower_bound=-2): fig, axs = plt.subplots(1, 2, figsize=(18, 5)) # Plot PCA with borders axs[0].axhline(y=pca_upper_bound, color='r', linestyle='--', xmin=0, xmax=1) axs[0].axhline(y=pca_lower_bound, color='r', linestyle='--', xmin=0, xmax=1) axs[0].plot(Xpca[:, 0], Xpca[:, 1], '.k') axs[0].grid() axs[0].set_title("PCA Results with Borders") # Plot SVD with borders axs[1].axhline(y=svd_upper_bound, color='r', linestyle='--', xmin=0, xmax=1) axs[1].axhline(y=svd_lower_bound, color='r', linestyle='--', xmin=0, xmax=1) axs[1].plot(Xsvd[:, 0], Xsvd[:, 1], '.k') axs[1].grid() axs[1].set_title("SVD Results with Borders") plt.show() # Load signal from CSV csv_file_path = # Nacist csv file y = load_signal_from_csv(csv_file_path) # Create and plot spectrogram spectrogram, stft_real = create_spectrogram(y) # Apply PCA and plot results Xpca = create_pca(stft_real) # Apply SVD and plot results Xsvd = create_svd(stft_real) # Plot PCA and SVD with borders Borders_PCA_SVD(Xpca, Xsvd, pca_upper_bound=2, pca_lower_bound=-2, svd_upper_bound=2, svd_lower_bound=-2)