当前位置:
首页 > temp > 简明python教程 >
-
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函数的值。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数