zoukankan      html  css  js  c++  java
  • C# 傅里叶变换 逆变换 调用MathNet包

    上司给我讲采样率,我觉得自己有点钻牛角尖了,想来想去还是不明白。

    因为说的是日语,サンプリング周波数,我就想是不是我对这个单词有什么误解,但是查了还是采样频率。要哭了。

    采样频率就是一个周期内的采样次数。画正弦波的时候就很迷惑,越想越不明白。

    一开始的代码是这样的

    1 for (double theta = 0.0; theta <= 2 * Math.PI; theta += Math.PI / (360 * 20))
    2             {
    3                 SinA.Points.AddXY(theta, Math.Sin(2 * Math.PI * theta * Convert.ToDouble(SinACb.Text)));
    4                 SinB.Points.AddXY(theta, Math.Sin(2 * Math.PI * theta * Convert.ToDouble(SinBCb.Text)));             
    5             }

    后来上司让我把采样率改成4096,代码变成了这样。

     1 double time = 0.000;
     2            
     3             for (int i = 0; i < 4096; i++)
     4             {
     5                 dataA[i] = Math.Sin(2 * Math.PI * Convert.ToDouble(SinACb.Text) * time);
     6                 time += 0.001;                                  
     7                 SinA.Points.AddXY(time, dataA[i]);
     8                 dataB[i] = Math.Sin(2 * Math.PI * Convert.ToDouble(SinBCb.Text) * time);             
     9                 SinB.Points.AddXY(time, dataB[i]);
    10             }

    我还是很不理解啊啊啊,这两个没有实际区别吧。这两个代码都是固定了总的取点数啊。

    我理解的采样率,每个周期采4096个点,频率不同,采样间隔也不同,但是这样画出来的波就很诡异,两个波合成后是什么牛鬼蛇神。然后跟上司继续讨论(其实是我单方面提问qwq,然后说sampling频率是两个采样点的时间间隔

    ???我又误解了吗?日语本来就不咋地,我觉得我理解不了了,自己回工位闷头研究。

    到这一步我还是没有问题的。因为画波,合成,用不到采样频率。

    接下来就是傅里叶变换了。用了MathNet的包,直接调用就可,反正傅里叶的内心我理解不了。

    1    for (int i = 0; i < 4096; i++)
    2             {
    3                
    4                 FFT.Points.AddXY(FFT_Freq_Calc(1000, 4096, i),
    5                                     FFT_dBAmplitudeCalc(complexData[i].Real, complexData[i].Imaginary));
    6             }

    这个频率的计算我就很迷惑,sampling频率除以4096乘以i,这个频率我不知道怎么确定,用了4096*50,导致最后的图x轴和频率不吻合,以下是失败图

    当事人就是蒙蔽,非常蒙蔽。咋还成一条直线了呢?然后试着调整这个值,当我鬼使神差写了1000以后,奇迹发生了

    呜呜呜这么正常的图谁看到不要感动!我就顿悟了为什么是1000,还记得一开始时间间隔设置成0.001了吗,取个倒数就是1000了

    所以问题就这么突然地解决了。以下是逆变换的代码。

     1  iFFTAnalysis2(ref complexData);
     2             
     3             areaFFT.AxisX.Maximum = 0.2;
     4             areaFFT.AxisX.Minimum = 0;
     5             areaFFT.AxisX.MajorTickMark.Interval = 1;
     6             
     7             
     8             areaFFT.AxisY.Maximum = 2;
     9             areaFFT.AxisY.Minimum = -2;
    10             areaFFT.AxisY.MajorTickMark.Interval = 1;
    11 
    12             double time = 0.000;
    13             for (int i = 0; i < 4096; i++)
    14             {
    15                 time += 0.001;
    16                 FFT.Points.AddXY(time, complexData[i].Real);
    17             }

    一开始不懂变换后的复数怎么办,只好用笨方法把复数的值复制到excel,然后画图,看效果,最后发现实部是y值,也就是sin函数的值。

  • 相关阅读:
    Jsp+Servlet实现文件上传下载——前台页面开发
    【软考】——原码、反码、补码、移码
    【NCRE】——c# 给PPT判分
    [RN] React Native Image 实现placeholder占位图
    [PHP] Elasticsearch 6.4.2 的安装和使用
    [RN] 使用 Genymotion 导致 ” Genymotion 已连接,但无法访问互联网 “ 的错误
    [RN] React Native 分享弹窗 ShareAlertDialog
    [RN] React Navigation 使用中遇到的显示 问题 汇总
    [RN] React Native Fetch请求设置超时
    [RN] React Native 滚动跳转到指定位置
  • 原文地址:https://www.cnblogs.com/mushaoai/p/12419447.html
Copyright © 2011-2022 走看看