妙用FFT之逆变换生成脸谱
原创:项道德(daode3056,daode1212)
快速傅立叶变换(FFT)有正向变换与反向变换,在极坐标系中,当对下图(左)正向变换之后,取不完全的比例进行逆变换,可生成以下右边的图案:
以下各图略去了原始曲线,直接出脸谱了:
//不完全FFT逆变换_花脸曲线(C#编程语言源代码):
private void button3_Click(object sender, EventArgs e)
{
/*
public static void FFT(double[] real, double[] imag, Accord.Math.FourierTransform.Direction direction)
Accord.Math.Transforms.FourierTransform2 的成员
*/
//画布,作图工具:
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
int xOrg = bmp.Width / 2; int yOrg = bmp.Height / 2;
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.Black);
//画刷,画笔:
Brush bh = new SolidBrush(Color.FromArgb(220, 220, 220));
Brush bh2 = new SolidBrush(Color.FromArgb(220, 220, 0));
Brush bh3 = new SolidBrush(Color.FromArgb(250, 0, 250));
Pen pen = new Pen(Color.FromArgb(255, 255, 0), 4);
Pen pen2 = new Pen(Color.FromArgb(255, 0, 255), 1);
//样本数据:
double[] real = new double[501];// { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };
double[] imag = new double[501];// { 1, 1.5, 3, 4, 5, 4.5, 5, 4, 3, 1.5, 1 };
Random RD = new Random();
double u1 = 0.5 * RD.NextDouble() + 0.5;
double u2 = 0.4 * RD.NextDouble() + 0.6;
double u3 = 0.3 * RD.NextDouble() + 0.7;
double u4 = 0.2 * RD.NextDouble() + 0.8;
for (int i = 0; i <= 500; i++)
{
float m = (float)((i - 250) / 25f);
real[i] = m;
//imag[i] = 40 * (8 * Math.Cos(m / u4 / 6) - 2 * Math.Cos(m / u3) + Math.Cos(2*m / u2 )) - 100;//OK
imag[i] = 40 * (8 * Math.Cos(m / u2 / 8) - 2 * Math.Cos(m / u3) + Math.Cos(2 * m / u4)) - 100; //OK
float q = (float)(PI * m / 10);
g.FillEllipse(bh3, (int)(imag[i]*Math.Sin(q) + xOrg*0.5), (int)(imag[i] * Math.Cos(q) + yOrg), 4, 4);//加圆点
}
//FFT正向变换,结果存入real1[],imag1[]:
double[] real1 = real;
double[] imag1 = imag;
Accord.Math.Transforms.FourierTransform2.FFT(real1, imag1, Accord.Math.FourierTransform.Direction.Forward);
//FFT逆向变换,结果存入real2[],imag2[]:
int NUM = (int)(real1.Length * (u1));//不完全截取,进行逆变换. 最大是: real1.Length;//
double[] real2 = new double[NUM];
double[] imag2 = new double[NUM];
for (int i = 0; i < NUM; i++)
{
real2[i] = real1[i];
imag2[i] = imag1[i];
}
Accord.Math.Transforms.FourierTransform2.FFT(real2, imag2, Accord.Math.FourierTransform.Direction.Backward);
//数据:
List<Point> LP = new List<Point>();
//绘制线段集与点集:
for (int i = 0; i < NUM; i++)
{
double x = real2[i];
double y = imag2[i];
g.FillEllipse(bh2, (int)(x - 2 + xOrg*1.5), (int)(y - 2 + yOrg-100), 4, 4);//加圆点
LP.Add(new Point((int)(x + xOrg*1.5), (int)(y + yOrg-100)));//+ yOrg
}
//显示数据:
g.FillPolygon(bh3, LP.ToArray());//填充多边形
g.DrawPolygon(pen, LP.ToArray());//封闭多边形
//string txt = string.Format("N3算法参数:{0:X}{1:X}{2:X}{3:X}", (int)(u1 * 0xFF), (int)(u2 * 0xFF), (int)(u3 * 0xFF), (int)(u4 * 0xFF));
//myGraphics.DrawString(txt, new Font("", 12), darkBlueBrush, boxWidth / 2 - 90, boxHeight - 25);
//------------------
//生成文本与保存图片: ===============================
string txt = sender.ToString().Split(':')[1] + string.Format("_{0:X}`{1:X}`{2:X}`{3:X}", (int)(100 * u1), (int)(100 * u2), (int)(100 * u3), (int)(100 * u4));
g.DrawString(txt, new Font("", 12), bh, boxWidth / 2 - 150, boxHeight - 25);
pictureBox1.Image = bmp;
bmp.Save(txt + ".png"); this.Text = txt + ".png ---文件已经保存";
this.pictureBox1.Refresh();
}
作者:daode3056[毕业于杭州师范大学数学系]
妙用FFT之逆变换生成脸谱相关推荐
- 【STM32H7的DSP教程】第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第32章 STM32H7的实数FFT的逆变换(支 ...
- 快速傅里叶变换FFT和逆变换的python编程
0. 预备知识 快速傅里叶变换旨在解决离散傅里叶变换DFT计算量大效率低的问题.当我们想要抑制噪声提取出某段信号中的有效信息时,如系统模型辨识或者是使用高精度力传感器测量人体腕部寸关尺脉搏信号这类应用 ...
- Python妙用|给小外甥生成10以内加减运算数学作业
前言: 前不久接到任务,要每天给小外甥出10以内的加减法习题.我寻思了一下,还是写代码生成测试习题方便. 为了自己偷懒,把习题和答案都生成,做完了让他自己检查,我只检查他有没有做题就行了^_^ 你还在 ...
- 【FPGA学习】Quartus II中NCO与FFT ip核的仿真
FPGA有许多IP核使用起来很方便,本篇博客记录一下NCO以及FFT的IP核使用和学习,实验平台是Altera公司的EP4CE40F23C8N 参考资料: Altera--NCO IP核详解 ALTE ...
- 1024点fft原理及fpga实现
1024点fft原理及fpga实现 关于傅里叶变换的原理,可以参考以下的博文: 如何理解傅里叶变换公式. FFT即快速傅里叶变换,是有限长序列作离散傅里叶变换(DFT)的快速算法. DFT公式为 X[ ...
- 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...
- matlab的fft与ifft,fft与ifft区别
OFDM是如何利用FFT和IFFT技术实现的_信息与通信_工程科技_专业资料.1.LTE 在广义上说只有一个载波,FDD 是上行和下行的载波分配在不同的频点,TDD 是在 同一个...... Matl ...
- Python: FFT的输入与输出分析
Python: FFT 目的 数据生成 FFT 分辨率 总结 引用 目的 本文简述如何使用numpy的fft lib进行快速傅里叶变换,以及对fft变换后结果的分析.由于水平有限,不当之处望指正. 数 ...
- 一文读懂傅立叶变换处理图像的原理
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 图 (a): (从左到右) (1) 原始图片 (2) 使用高斯低通 ...
- 图像相减的matlab仿真及光栅滤波法,图像相减的MATLAB 仿真及光栅滤波法实验实现...
图像相减的MATLAB 仿真及光栅滤波法实验实现 毕业设计(论文)中期报告题目图像相减的MATLAB仿真及光栅滤波法实验实现院(系)光电学院专业光信息科学与技术班级090106姓名陈凤学号090106 ...
最新文章
- 【无标题】科大星云诗社动态20220109
- 微信朋友圈+html+字体,一键修改微信朋友圈字体,快来试试吧
- vue_组件_监听组件事件
- 火狐浏览器中文乱码怎么办 Firefox中文乱码解决方法
- fuel部署openStack
- 应用层安全协议Kerberos
- 什么是服务的熔断降级
- Delphi 与 DirectX 之 DelphiX(3): 初识 TDXDraw
- warning: C4819的解决办法
- ccc tiledmap
- python实现爬虫收集图片 花瓣网_Python爬虫日记七:批量抓取花瓣网高清美图并保存...
- html添加js的代码注释,JavaScript 注释方法总结
- 【系统安全学习5】PGP加密
- vue移动端日历显示查看每日详情列表
- sharepoint文档库文件下载
- IBM应用SOA 开创网上“虚拟故宫”
- 计蒜客 青出于蓝胜于蓝 dfs序+树状
- RobotStudio实现喷漆、打磨等功能(曲面路径生成与仿真)
- html5 音乐播放进度条,js实现音乐播放控制条
- 互联网巨头追捧的“中台”战略,有多重要?