写了之前的东西总感觉低级,为啥子?连个数组都没有。
C里面至少还有指针啥玩意,java肯定也有,至少有类似的吧,毫无疑问,必然有。
寡人徒手撸一个rfft即输入是实数的fft,不知道啥是fft请百度。不过代码不全部公开,抱歉。
吐槽一下,java里面连log2都没有,卧槽,C里面可是直接就有的,我还得再定义一个函数,真心累。
一个好消息是Java没有指针了,至少没有显式的这种*,另外也没有malloc这种分配空间的方法了,直接用Cpp与Java通用的new吧
先上个图,rfft的结果C、Java、Python一样:
代码在此:
package com.mystft.method;
import java.lang.Math;
public class STFT {
private static double log2(int x) {
return Math.log(x) / Math.log(2);
}
public static float[] rfft(float[]rin,int n_fft){
int ii, m, is, i, j, nv, jj,k=(int) log2(n_fft);
float p, q, s, vr, vi;
float []pi=new float[n_fft];
float[]fr=new float[n_fft];
float[]fi=new float[n_fft];
float[]rout=new float[n_fft];
for (i=0;i<n_fft;i++){
pi[i] = 0;fr[i] = 0;fi[i] = 0;
}
for (ii=0;ii <= n_fft - 1; ii++){
...
for (i = 0; i <= k - 1; i++){
...
}
fr[ii] = rin[is];
fi[ii] = pi[is];
}
...
for (i = 2; i <= n_fft - 1; i++){
...
}
for (ii = 0; ii <= n_fft - 2; ii = ii + 2){
...
}
...
for (jj = k - 2; jj >= 0; jj--) //蝴蝶操作
{
...
for (ii = 0; ii <= (m - 1)*nv; ii = ii + nv)
for (j = 0; j <= (nv / 2) - 1; j++)
{
...
}
}
...;
return rout;
}
public static void main(String[]args){
float []rin={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
float []rout=rfft(rin,16);
for (int i=0;i<9;i++){
System.out.println("i="+i+","+"f="+rout[i]);
}
}
}
另外有相关问题可以加入QQ群讨论,不设微信群
QQ群:868373192
语音深度学习及信号处理群