频率 - 使用处理从fft到文件到列表

时间:2016-12-07 09:04:06

标签: processing fft

我正在做一个项目,我将输出频率从实时麦克风输入通过fft输出到txt文档,然后检索(或尝试检索)它们到4个频率的列表。我的列表数组是空的,即控制台打印[]并且没有数字。 Pl告诉我逻辑/代码有什么问题。这是在void draw()

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();

1 个答案:

答案 0 :(得分:0)

将您的目标拆分为子任务:

  1. 获取FFT数据(和4个频率)
  2. 将浮动值保存/加载到磁盘
  3. 将1和2放在一起
  4. 看起来你已经完成了第一部分。 目前还不清楚4个频率是什么,但你可以自己解决这个问题。

    令人困惑的部分是您调用获取FFT数据一次然后尝试将其直接保存到磁盘。我不是100%这就是你的意思。 仔细检查是否需要先保存少量样本/秒的FFT数据。

    我想象一个更通用的场景:

    1. 加载以前保存的FFT数据(如果有)
    2. 处理FFT数据(只要需要 - 可能需要一个开始/停止布尔值)并附加
    3. 保存当前的FFT数据
    4. 继续保存和加载数据。 你有一些选项可以构建到Processing中来存储数据:

      1. 通过saveStrings() / loadStrings()
      2. 打字
      3. CSV表格通过saveTable() / loadTable() / Table
      4. JSON通过JSONObject / JSONArray和可用的加载/保存功能
      5. XML
      6. 我建议阅读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例子:

        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();
        }
        

        尝试代码,查看输出,阅读评论,阅读参考资料,调整/重试/理解并适应您的问题。