我目前正试图弄清楚如何使用Eigen的 FFT 算法。让我们假设我有一个功能
std::complex<double> f(std::complex<double> const & t){
return std::sin(t);
}
Run Code Online (Sandbox Code Playgroud)
然后我用这个函数计算
Eigen::VectorXcd time(1000);
Eigen::VectorXcd f_values(1000);
for(int u = 0; u < 1000; ++u){
time(u) = u* 2. * M_PI / 1000;
f_values(u) = f(time(u));
}
Run Code Online (Sandbox Code Playgroud)
我现在想计算 的傅立叶变换f_values,所以我做
Eigen::FFT<double> fft;
Eigen::VectorXcd f_freq(1000);
fft.fwd(f_freq, f_values);
Run Code Online (Sandbox Code Playgroud)
现在我想绘制它,但要做到这一点,我需要f_freq评估的频率,但我真的不知道如何获得这些频率。所以我的问题归结为找到Eigen::VectorXcd包含频率来绘制这样的东西
(我很抱歉使用图片作为描述,但我认为这样更清晰,如果我试图用文字来描述它......amplitude来自情节的应该对应于我f_freq和我寻找的是freqin的值图片……)。
以下是放在单个文件中的上述代码片段:
#include <eigen3/Eigen/Dense>
#include <eigen3/unsupported/Eigen/FFT>
#include <complex>
#include <cmath>
std::complex<double> f(std::complex<double> const & t){
return std::sin(t);
}
int main(){
Eigen::VectorXcd …Run Code Online (Sandbox Code Playgroud) 假设你有一个二进制文件example.bin,并且你想以 为单位读取该文件f64,即前 8 个字节给出一个浮点数,接下来的 8 个字节给出一个数字等。(假设你知道字节序)这在 Rust 中如何完成?
我知道可以用来std::fs::read("example.bin")获取 aVec<u8>数据,但是你必须做很多“体操”才能将 8 个字节始终转换为 a f64,即
fn eight_bytes_to_array(barry: &[u8]) -> &[u8; 8] {
barry.try_into().expect("slice with incorrect length")
}
let mut file_content = std::fs::read("example.bin").expect("Could not read file!");
let nr = eight_bytes_to_array(&file_content[0..8]);
let nr = f64::from_be_bytes(*nr_dp_per_spectrum);
Run Code Online (Sandbox Code Playgroud)
我看到了这篇文章,但它是从 2015 年开始的,从那时起 Rust 发生了很多变化,所以我想知道现在是否有更好/更快的方法?