2016-12-07 78 views
-1

我正在做一個項目,我正在輸出實時麥克風輸入通過fft到txt文檔的頻率,然後檢索(或嘗試檢索)到列表中的4個頻率。我的列表數組是空的,即控制檯打印[],並沒有數字。 Pl告訴我什麼是邏輯/代碼錯誤。這是無效的draw()頻率 - 從fft到文件到使用處理列表

for (int i = 0; i<fft.specSize(); i++) { 

float freq = fft.getFreq(i); 
int freqint = (int) freq; 
//println(freqint); 
output.println(freqint);} 



Scanner input = new Scanner("...\\list.txt"); 





while (input.hasNextInt()) { 
    list.get(input.nextInt(4)); 

} 




println(list); 


input.close(); 

回答

0

分裂您TAKS爲子任務中:

  1. 獲取FFT數據(和4個頻率)
  2. 保存/載入浮點值到磁盤
  3. 把1和2放在一起

看起來你已經有了第一個p藝術完成。 目前還不清楚這四個頻率是什麼,但你可以自己解決這個問題。

令人困惑的部分是,您只需調用一次FFT數據,然後嘗試將其直接保存到磁盤。我不是100%,這就是你的意思。 仔細檢查您是否需要先保存少數樣本/秒的FFT數據。

我會想象一個更一般的情況是這樣的:

  1. 負載先前保存的FFT數據(如果有的話)
  2. 處理FFT數據(只要需要 - 可能需要一個啓動/停止布爾)並追加
  3. 保存當前FFT數據

移動到保存和加載數據。 你有幾個選項構築成處理用於存儲數據:通過JSONObject/JSONArray和可用負荷通過saveTable()/loadTable()/Table

  • JSON通過saveStrings()/loadStrings()
  • CSV表

    1. 字符串/保存功能
    2. XML

    我建議你閱讀Daniel Shiffman's Data Tutorial

    與保存/載入處理浮點值到磁盤獨自一人, 這裏是使用字符串概念片段的基本證明:

    int fftSpecSize = 10;//this will be fft.specSize() in your case 
    
    String values = ""; 
    
    for(int i = 0 ; i < fftSpecSize; i++){ 
        //random(1) is a placeholder for fft.getFreq(i); 
        values += random(1); 
        //if it's not the last value, add a separator character (in this case space) 
        if(i < fftSpecSize-1){ 
        values += " "; 
        } 
    } 
    
    println("values to save:"); 
    println(values); 
    println(); 
    //save data 
    saveStrings("fftSingleRead.txt",values.split(" ")); 
    
    //load data 
    String[] readValues = loadStrings("fftSingleRead.txt"); 
    
    //print raw loaded data 
    println("readValues from .txt file:"); 
    println(readValues); 
    println(); 
    
    //parse values: 
    for(int i = 0 ; i < readValues.length; i++){ 
        float value = float(readValues[i]); 
        println("readValues[",i,"] = ",value); 
    } 
    

    另外這裏有一個表例子太多:

    Table fftValues; 
    int specSize = 10; 
    
    //create a new table 
    fftValues = new Table(); 
    //add columns - one per FFT bin 
    for(int i = 0 ; i < specSize; i++){ 
        fftValues.addColumn(); 
    } 
    
    //add some data, a row per reading 
    //create a new row 
    TableRow newRow = fftValues.addRow(); 
    //add each fft value to the row 
    for(int fftCount = 0 ; fftCount < specSize; fftCount++){ 
        //placeholder for newRow.setFloat(fftCount,fft.getFreq(fftCount)); 
        newRow.setFloat(fftCount,random(1)); 
    } 
    //add the row to the table 
    fftValues.addRow(newRow); 
    
    //save to disk 
    saveTable(fftValues,"fftValues.csv","csv"); 
    
    //load from disk 
    Table readValues = loadTable("fftValues.csv","csv"); 
    //access the data that has been saved in the table 
    for(int rowCount = 0; rowCount < readValues.getRowCount(); rowCount++){ 
        TableRow currentRow = readValues.getRow(rowCount); 
        print("row[",rowCount,"] = "); 
        for(int columnCount = 0; columnCount < currentRow.getColumnCount(); columnCount++){ 
    
        float value = currentRow.getFloat(columnCount); 
    
        print(value); 
    
        if(columnCount < currentRow.getColumnCount() - 1){ 
         print(","); 
        } 
        } 
        println(); 
    } 
    

    嘗試代碼,看到輸出,閱讀評論,閱讀參考,調整/重試/理解和適應您的問題。

  • +0

    我打算做的是在fft之後得到前四個或五個頻率。就這樣。但是要做到這一點,我必須對txt文件進行迂迴寫入,然後使用掃描器,因爲掃描器只接受字符串或文件。當我運行時,txt文件確實記錄了int的頻率,並且幾乎前800到1000個數字是0,然後只有其他數字,例如1或11或14,或者來自麥克風聚集的實時輸入進入。 –

    +0

    Pl同時檢查我的第一篇文章後顯示的第二篇文章。我認爲它會在你的後面顯示。 –

    +0

    嘗試了你的代碼。首先,它起作用,我認爲讀取/保存前十個頻率。如你所述,會更精細地理解它並適應我的問題。 –