FFT(s) sur un signal

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre Mathieu
Messages : 6
Enregistré le : 09 Mai 2017, 12:22

FFT(s) sur un signal

Messagepar Pierre Mathieu » 11 Mai 2017, 13:31

Bonjour,
J'enregistre les données d'un capteur dans un fichier csv. Le fichier est de type :

Code : Tout sélectionner

0.12  0.16  0.18  0.21  0.26  0.28
0.30  0.33  0.39  0.42  0.37  0.26
0.22  0.19  0.16  0.14  0.11  0.09

Les valeurs sont lues ligne par ligne et la fréquence d’acquisition est de 16Hz. Mon fichier contient des données sur 24H.
Je souhaite faire une boucle qui me permet de faire une transformée de Fourier toute les heures.

Voici le début de mon code (sans la boucle)

Code : Tout sélectionner

data <- read.csv("data.csv", header = FALSE)
#lecture ligne par ligne
concatRow <- as.vector(t(data))
fe <- 16                   # frequence = 16Hz
T <- 1/fe
t <- T*seq(length(concatRow))      # temps

# exemple transformée de fourier sur 1H de données
a<-(4*3600)*fe
b<-(5*3600)*fe

# calculate fft of data
fourier <- fft((concatRow)[a:b])

# extract magnitudes and phases
magn <- Mod(fourier) # sqrt(Re(fourier)*Re(fourier)+Im(fourier)*Im(fourier))
phase <- Arg(fourier) # atan(Im(fourier)/Re(fourier))

# select only first half of vectors
magn.1 <- magn[1:(length(magn)/2)]

# generate x-axis with frequencies
x.axis <- 1:length(magn.1)/3600

# plot magnitudes against frequencies
plot(x=x.axis,y=magn.1,type="l", xlab='Frequencies (Hz)', ylab='Magnitude')



et le début de la boucle afin de faire une fft toute les heures sur le signal

Code : Tout sélectionner

for (i in seq(1/fe,length(concatRow),by=3600)){
 

}


cependant je suis coincé sur la construction de la boucle.. si quelqu'un pouvait m'aider !

Je vous remercie,
Pierre.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: FFT(s) sur un signal

Messagepar Pierre-Yves Berrard » 11 Mai 2017, 15:49

Bonjour,

Une idée en découpant le vecteur initial en groupes de 57600 (16 * 3600 signaux par heure).

Code : Tout sélectionner

nbsign <- length(concatRow)
nbsign_par_heure <- 57600
nbheures <- nbsign %/% nbsign_par_heure + 1

groupes <- rep(
  seq(nbheures),
  each = nbsign_par_heure,
  length.out = nbsign
)

tapply(concatRow, groupes, fft)
PY

Pierre Mathieu
Messages : 6
Enregistré le : 09 Mai 2017, 12:22

Re: FFT(s) sur un signal

Messagepar Pierre Mathieu » 12 Mai 2017, 09:46

Je vous remercie, cela fonctionne bien mieux que ma boucle for !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité