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

Processing 频率-使用处理从fft到文件到列表,processing,fft,Processing,Fft,我正在做一个项目,通过fft将实时麦克风输入的频率输出到txt文档,然后检索(或尝试检索)到4个频率的列表。我的列表数组结果为空(控制台打印[],但其中没有数字)。请告诉我逻辑/代码有什么问题。这在void draw()中 for(int i=0;i将TAK拆分为子任务: 获取FFT数据(和4个频率) 将浮点值保存/加载到磁盘 把1和2放在一起 看起来你已经完成了第一部分。 不清楚这4个频率是什么,但你可以自己弄清楚 令人困惑的是,你调用了一次get FFT数据,然后试图将它直接保存到磁盘上。我

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


for(int i=0;i将TAK拆分为子任务:

  • 获取FFT数据(和4个频率)
  • 将浮点值保存/加载到磁盘
  • 把1和2放在一起
  • 看起来你已经完成了第一部分。 不清楚这4个频率是什么,但你可以自己弄清楚

    令人困惑的是,你调用了一次get FFT数据,然后试图将它直接保存到磁盘上。我不是100%,你的意思是这样做的。 如果需要先保存几次采样/秒的FFT数据,请仔细检查

    我可以想象这样一个更一般的场景:

  • 加载以前保存的FFT数据(如果有)
  • 处理FFT数据(只要需要-可能需要启动/停止布尔值)并附加
  • 保存当前FFT数据
  • 继续保存和加载数据。 在存储数据的处理过程中,您有一些内置选项:

  • 字符串通过/
  • CSV表格通过//
  • JSON通过/和可用的加载/保存函数
  • 我推荐阅读

    处理仅将浮点值保存/加载到磁盘的问题, 下面是一个使用字符串的基本概念验证代码段:

    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);
    }
    
    int fftSpecSize=10;//在您的例子中,这将是fft.specSize()
    字符串值=”;
    对于(int i=0;i
    此外,这里还有一个表格示例:

    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();
    }
    
    表FFT值;
    int specSize=10;
    //创建一个新表
    FFT值=新表();
    //添加列-每个FFT箱一列
    对于(int i=0;i

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

    我本打算做的是在fft后获得前四个或五个频率。仅此而已。但要做到这一点,我必须对txt文件进行迂回写入,然后使用扫描仪,因为扫描仪只接受字符串或文件。当我n、 txt文件确实以int为单位记录频率,几乎前800到1000个数字都是0,然后只有其他数字,如1、11或14,或者任何来自麦克风采集的实时输入。Pl也检查我的第二篇文章,它显示在我的第一篇文章之后。我想它会显示在你的后面。尝试了你的代码。在f第一个例子,它可以工作,我认为可以读取/保存前十个频率。我会更仔细地理解它,并适应你提到的我的问题。删除我的帖子,因为它似乎是多余的。现在,我如何保存前几个频率,即前10个或20个?我通过fft.getFreq(I)获得频率在for循环或代码中的freq的随机占位符中。我只想将前几个频率仍然保存在txt文件中,甚至打印到控制台。如果我试图通过变量或列表将频率从for循环中取出,我会得到空列表。我被卡在那里了。