如何使用 awk 或 shell 脚本计算频谱?

How to compute spectrum using awk or shell scripting?

我想使用 awk 或 shell 脚本来计算频谱。我有一个数据,例如

ifile.txt
1
2
3
4
1
3
2
2
3
99

其中 99 是一个未定义的值。

频谱计算公式为 对于 k=1,2,3,4,...

我是按照下面的方式做的。

for i in {1..10};do
awk '{if( != 99) printf "%f %f\n", 
     *sin(2*3.14*'$i'*NR/10), 
     *cos(2*3.14*'$i'*NR/10)}' ifile.txt > ifile1.txt
sum_1=$(awk '{sum += } END {print sum}' ifile1.txt)
sum_2=$(awk '{sum += } END {print sum}' ifile1.txt)
awk '{printf "%f\n", (1/2)*(((1/5)*('$sum_1')^2)+((1/5)*('$sum_2')^2))}' 
     >> ofile.txt
done

请指出我哪里做错了。计算既不打印任何东西也不结束。但是我在 ifile1.txt

中获取值

在我们成功对话后,我将我们的共同努力编译成一个独立的 awk 脚本 (spectrum.awk):

 < 99 {
  for (i = 1; i <= 10; ++i) {
    sum1[i] += *sin(2*3.14*i*NR/10)
    sum2[i] += *cos(2*3.14*i*NR/10)
  }
  next
}
END {
  for (i = 1; i <= 10; ++i) {
    printf "%f\n", (1/2)*(((1/5)*(sum1[i])^2)+((1/5)*(sum2[i])^2))
  }
}

它使用数组(sum1sum2)在一个 运行 中计算所有 10 个值。

很遗憾,我对理论背景一无所知。我看不到你的图像(由于我公司的代理问题)。因此,如果计算错误,您可以反馈。

示例会话:

$ echo '1
2
3
4
1
3
2
2
3
99' | awk -f spectrum.awk
1.417046
2.019819
0.288438
2.688501
0.100023
2.680672
0.296974
1.993613
1.338068
44.097319

至少,它看起来 "nice"。