我将首先在javascript中实现四个方程式,然后在go中实现。我的问题是我不是数学家,我不知道如何阅读方程式。
首先是FFT窗口Blackman。
其次是FFT算法:
第三是随着时间的推移平滑:
第四是分贝:
我不能使用fft库来完成这项工作,需要实现这四个方程式。完成工作后,我将在同一信号上按此顺序运行这四个方程式。
任何人都可以帮助解释我是如何从等式到工作代码的吗? 我不知道应该从哪里开始。
感谢您的回答
答案 0 :(得分:1)
这是在javascript中。对Go也进行适当的更改。我没有测试过所有内容,只是将数学方程式转换为代码。如果有错误,请更正答案。
var pi = 3.14;
var blackmann = function(N){
var a = 0.16;
var a0 = (1-a)/2, a1 = 1/2, a2 = a/2;
var w = [];
for (var i=0; i<N, i++){
w[i] = a0 - a1*Math.cos(2*pi*i/N) - a2*Math.cos(4*pi*i/N);
}
return w;
}
var fft = function(x, K){
var X1 = [], X2 = [];
var N = x.length;
// X1 for the real spectrum, X2 for the imaginary part.
// For magnitude spectrum take |X1^2 + X2^2|
// For a K point fft
for (var k=0; k<K; k++){
for (var n=0; n<N; n++){
X1[k] = Math.cos(2*pi*n/N);
X2[k] = Math.sin(-2*pi*n/N);
}
}
return {"real":X1, "img":X2}
}
var smooting = function(x){
var s = [], t = 0.16
s[0] = x[0];
for (var i=1; i<x.length; i++){
s = t*s[i-1] + (1-t)*x[i]
}
return s
}
var decibel = function(X){
var Y = [];
for (var i =0;i<X.length(); i++){
Y[i] = Math.log10(Math.abs(X[i]));
}
return Y;
}