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