欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 傅里叶变换 逆变换 调用MathNet包

程序员文章站 2022-05-29 13:17:24
上司给我讲采样率,我觉得自己有点钻牛角尖了,想来想去还是不明白。 因为说的是日语,サンプリング周波数,我就想是不是我对这个单词有什么误解,但是查了还是采样频率。要哭了。 采样频率就是一个周期内的采样次数。画正弦波的时候就很迷惑,越想越不明白。 一开始的代码是这样的 1 for (double the ......

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

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

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

 

一开始的代码是这样的

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频率是两个采样点的时间间隔

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

C# 傅里叶变换 逆变换 调用MathNet包

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

接下来就是傅里叶变换了。用了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轴和频率不吻合,以下是失败图

C# 傅里叶变换 逆变换 调用MathNet包

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

C# 傅里叶变换 逆变换 调用MathNet包

呜呜呜这么正常的图谁看到不要感动!我就顿悟了为什么是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函数的值。