2017-08-08 1 views
1

J'essaye d'exécuter un Python STFT (également connu sous le nom de transformée de Fourier de courte durée) sur deux morceaux de données échantillonnés de façon identique. Cependant, en raison de l'une de mes applications de données, j'ai besoin d'une partie de celui-ci pour être collecté dans un fichier .txt.Différentes sorties Python avec transformée de Fourier Signal

Je suis confus quant à la raison pour laquelle le STFT fonctionnerait pour les données provenant du .csv, et ne produirait pas une sortie correcte pour les données provenant du fichier .txt. Les deux sont Panda.core.series.Series types de données, et les deux ont des valeurs sur des amplitudes similaires. Les conditions d'essai étaient également identiques.

Le code que j'essaye de dépanner est le code étiqueté, Code that isn't returning the expected output. Toute idée ou observation serait grandement appréciée! Notez que j'ai la ligne result[::4] parce que j'ai dû me débarrasser de 3 échantillons sur 4, pour correspondre aux taux d'échantillonnage entre les deux méthodes d'acquisition de données.

code qui ne retourne pas le résultat attendu:

import json 
result = [] 
with open("C:\\Users\\Desktop\\data.txt") as file: 
    for line in file: 
     result.append(json.loads(line)[-1]) 
result = result[::4] 
result = pd.Series(result) 

f, t, Zxx = scipy.signal.stft(result, fs=500, nperseg = 1000) 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax1.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=0.001) 
plt.ylabel('Frequency [Hz]') 
plt.xlabel('Time [sec]') 
plt.show() 

code qui fonctionne correctement:

test = pd.read_csv("C:\\Users\\Documents\\data.csv") 
test.head() 
test.columns = ['TS', 'Col1', 'Col2', 'Col3', 'Col4'] 

f, t, Zxx = scipy.signal.stft(test['Col1'], fs=500, nperseg = 1000) 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax1.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=0.001) 
plt.ylabel('Frequency [Hz]') 
plt.xlabel('Time [sec]') 
plt.show() 
+0

Vous devez utiliser un filtre passe-bas avant de décimer. [Decimation] (https://en.wikipedia.org/wiki/Decimation_ (signal_processing)): "Le sous-échantillonnage seul entraîne une mauvaise interprétation des composants de signal haute fréquence par les utilisateurs suivants des données, ce qui est une forme de distorsion appelée aliasing. " –

+0

Cela a du sens. Comment devrais-je déterminer la fréquence pour laquelle créer le filtre passe-bas? – Gary

+0

Et puis, comment puis-je prendre la sortie passe-bas et le rebrancher dans mon STFT? – Gary

Répondre

0

Vous devriez être en mesure de remplacer

result = result[::4] 

avec

result = scipy.signal.decimate(result, 4, ftype='fir') 

I spécifié 'fir' pour le type de filtre, parce filtres FIR ont un retard de phase linéaire. Cela peut ou non être important dans votre situation.