Autore Topic: Uso dei dati di un file txt per calcolare una FFT  (Letto 678 volte)

Offline Gazzerpiece

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore
  • Sistema operativo:
    Windows 7
Uso dei dati di un file txt per calcolare una FFT
« il: 12 Settembre 2013, 15:01:31 CEST »
0
Salve a tutti,

Sono nuovo di questo linguaggio e ho bisogno di una mano. :D

Non riesco a capire come posso sfruttare un char[] di dati letti da un file txt. Più precisamente sono dati presi da un accelerometro triassale, dal quale ho ricavato tre file e li ho importati nella sd dell'emulatore.

Codice di lettura di un file txt dalla sd:

protected char[] bufx = new char[9000];
.
.
.
protected  char[] loadx(String filename, char[] buffer) {
      updateExternalStorageState();
      if (!externalStorageCanRead) {
         Toast.makeText(this, "Impossibile leggere dallo storage esterno", Toast.LENGTH_LONG).show();
      }
      File extStorageDir = Environment.getExternalStorageDirectory();
      File file = new File(extStorageDir, filename);

      Reader reader = null;
      try {
         reader = new FileReader(file);
         StringBuffer aux = new StringBuffer();
         
         int len;
         while ((len = reader.read(bufx)) != -1) {
            aux.append(bufx, 0, len);
         }

         Toast.makeText(this, "Testo caricato", Toast.LENGTH_LONG).show();
         return bufx;
      } catch (FileNotFoundException e) {

         Toast.makeText(this, "Testo non trovato", Toast.LENGTH_LONG).show();
         return bufv;
      } catch (IOException e) {
         Log.e("Accx", "Impossibile aprire il file", e);

         Toast.makeText(this, "Errore", Toast.LENGTH_LONG).show();
         return bufv ;
      } finally {
         if (reader != null) {
            try {
               reader.close();
            } catch (Throwable t) {
            }
         }}
   
   }

Naturalmente ho fatto un controllo sulla possibilità di lettura dello storage esterno.
Dopo di che sempre nella solita activity ne richiamo un'altra e li passo il buffer letto:

private void startAsseX() {
      Intent in = new Intent(this, AsseX.class);
      in.putExtra("progetto.progetto.AsseX", bufx);
      startActivity(in);
   }

In questa seconda attività ho diviso il buffer in 3 sotto buffer di dimensioni uguali.Ecco una parte di codice es:

int dim = 3000;
   char [] primaParte = new char[dim];
   char [] secondaParte = new char[dim];
   char [] terzaParte = new char[dim];

   char[] bufx = getIntent().getExtras().getCharArray("progetto.progetto.AsseX");
   
   
   for(int i=0; i < 3000; i++) {
      System.out.println("Prelevazione primi 3000 campioni del segnale dell'asse X (bufx) ");
      primaParte = bufx;
   }

A questo punto come posso sfruttare i dati nel buffer bufx che sono in formato char[] per calcolare una FFT(i dati sono disposti in righe)?



Post unito: 12 Settembre 2013, 15:11:53 CEST
Scusa ho sbagliato la domanda in fondo.
I dati da usare sono diventati quelli dei tre "sottobuffer" di 3000 campioni primaparte[], secondaparte[], terzaparte[].
In sostanza però non cambia il problema visto che rimangono char[], solo più piccoli. :-)
« Ultima modifica: 12 Settembre 2013, 15:11:53 CEST da Gazzerpiece, Reason: Merged DoublePost »

Offline matttt

Re:Uso dei dati di un file txt per calcolare una FFT
« Risposta #1 il: 12 Settembre 2013, 20:36:07 CEST »
0
In sostanza... qual'è il problema di preciso?
Poi...
- com'è strutturato il TXT?
- non fai prima a leggere il file riga per riga (usando BufferedReader.readLine())? (ammesso che sia distribuito su più righe)
BufferedReader | Android Developers
- che separatori hai tra un dato e l'altro? eventualmente in queste situazioni può andare comodo String.split()
Le mie apps su Google Play Store:

Offline Gazzerpiece

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore
  • Sistema operativo:
    Windows 7
Re:Uso dei dati di un file txt per calcolare una FFT
« Risposta #2 il: 13 Settembre 2013, 09:19:41 CEST »
0
Il problema principale è : come sfruttare le righe lette dal file con una libreria FFT(ho bisogno di trovare la frequenza del segnale)?
Gli unici algoritmi che ho trovato richiedono degli interi..

Per quanto riguarda il modo di lettura..strutturando cosi  non mi riconosce comunque le righe nel char[]?

  File extStorageDir = Environment.getExternalStorageDirectory();
      File file = new File(extStorageDir, filename);

      Reader reader = null;
      try {
         reader = new FileReader(file);
         StringBuffer aux = new StringBuffer();
         
         int len;
         while ((len = reader.read(bufx)) != -1) {
            aux.append(bufx, 0, len);
         }

Il file che leggo invece è cosi fatto(te ne copio uno spezzone):

337.036, 21
337.076, 14
337.116, 11
337.156, 11
337.196, 9
337.236, 5
337.276, 2
337.316, -2
337.356, -4
337.396, -5
337.436, -6
337.476, -6
.
.
.
Grazie per la collaborazione nel frattempo  ;-)

Offline matttt

Re:Uso dei dati di un file txt per calcolare una FFT
« Risposta #3 il: 13 Settembre 2013, 18:35:36 CEST »
0
FFT = Fourier ? Con int ?!
Se proprio proprio devi lavorare con interi potresti moltiplicarli per 10 o per 100, in modo da conservare almeno 1 o 2 decimali.
E poi ovviamente vanno fatti gli opportuni adattamenti dei risultati...

Per il resto non capisco cosa intendi.
Io ragiono in questo modo: ho un file composto di righe? Allora lo leggo riga per riga e poi splitto con la virgola.
Perché lavorare con char[] ? Mi sembra una complicazione in più...
Le mie apps su Google Play Store:

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Uso dei dati di un file txt per calcolare una FFT
« Risposta #4 il: 13 Settembre 2013, 18:38:02 CEST »
0
Ricordati quando riporti del codice di usare il tag del codice Java, in questo modo viene formattato correttamente.

L'uso dei buffer a grandezza fissa è molto brutto da vedere, un buon programmatore è in grado di leggere un file TXT senza sapere a priori il numero di righe presenti. Comunque è inutile salvare i dati in un buffer di char, quello che ti serve è leggere una singola riga e aggiungere il campione in un vettore di interi e se vuoi anche il tempo in un vettore di float (il formato riportato è tempo, campione da quello che si vede).

L'algoritmo della FFT utilizza i numeri interi altrimenti non può sfruttare la struttura a butterfly quando vengono elaborati i singoli bit. La FFT la puoi vedere come una versione molto veloce con i numeri interi di una DFT. Esistono delle librerie e dei software che accettano campioni non interi, internamente effettuano una conversione, calcolano FFT per poi riconvertire il risultato nel tipo di partenza.
adb logcat | tee /tmp/logcat | grep TAG

Offline Gazzerpiece

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore
  • Sistema operativo:
    Windows 7
Re:Uso dei dati di un file txt per calcolare una FFT
« Risposta #5 il: 13 Settembre 2013, 18:51:33 CEST »
0
Ok ragazzi mi sembra di capire che ho proprio sbagliato il modo di prendere i dati dal file.
 Cercherò di seguire i vostri consigli  e vi ringrazio molto. :D