音乐频谱分析
不同频谱下音乐的不同听感和音质

不同频谱下音乐的不同听感和音质高音频段HF :6-20HZ 这个频段的声音幅度影响音色的表现力。
如果这个频段的泛音幅度比较丰满,那么音色的个性表现良好,音色的解析能力强,音色的彩色比较鲜明。
这个频段在声音的成分中幅度不是很大,也就是说,强度不是很大,但是它对音色的影响很大,也就是说,强度不是很大,但是它对音色的影响很大,所以说它很宝贵、很重要。
比如,一把小提琴拉出a'--440Hz 的声音,双簧管也吹出a'--440Hz 的声音,它们的音高一样,音强也可以一样,但是一听就能听出哪个声音是小提琴,哪个声音是双簧管,其原因就是,它们各自的高频泛音成分各不相同。
一首歌曲也是一样,例如韦唯演唱一首《爱的奉献》,田震也演唱一首《爱的奉献》。
两首歌调一样,响度也一样,而人们一听使知哪个是田震唱的,哪个是韦唯唱的。
这就说明,两个歌手各自的高频泛音不同,高频成分的幅度不同,所以说两个人的音色个性也就不同。
如果这个频段成分过小了,那么音色的个性就减色了,韵味也就失掉了,声音就有些尖噪,出现沙哑声,有些刺耳的感觉了。
因此,高频段成分不要过量。
然而又绝对不能没有,否则声音会失去个性。
中高音频段MIDHF :600Hz-6Hz :这个频段是人耳听觉比较灵敏的频段,它影响音色的明亮度、清晰度、透明度。
如果这个频段的音色成分太少了,则音色会变和黯淡了,朦朦胧胧的好像声音被罩上一层面纱一样;如果这频段成分过高了,音色就变得尖利,显得呆板、发楞。
中低音频段MIDLF :200-600Hz :这个频段是人声和主要乐器的主音区基音的频段。
这个频段音色比较丰满,则音色将显得比较圆润、有力度。
因为基音频率丰满了,音色的表现力度就强,强度就大,声音也变强了。
如果这个频段缺乏,其音色会变得软弱无力、空虚,音色发散,高低音不合拢;而如果这段频率过强,其音色就会变得生硬、不自然。
因为基音成分过强,相对泛音的强度就变弱了,所以音色缺乏润滑性。
音频信号处理中的相位和频率分析方法

音频信号处理中的相位和频率分析方法随着科技的不断发展,音频信号处理在音乐、通信、语音识别等领域发挥着越来越重要的作用。
在音频信号处理中,相位和频率分析是两项关键的技术。
相位分析用于描述信号的波形特征,而频率分析则用于确定信号的频率成分。
本文将介绍音频信号处理中常用的相位和频率分析方法。
一、相位分析方法1. 傅里叶变换(Fourier Transform)傅里叶变换是将时域信号转换为频域信号的重要数学工具。
在音频信号处理中,我们可以通过傅里叶变换获取信号的频谱,从而分析信号的相位信息。
2. 短时傅里叶变换(Short-time Fourier Transform, STFT)短时傅里叶变换是对信号进行频谱分析的一种常用方法。
它将信号分为多个时间窗口,并对每个时间窗口进行傅里叶变换。
通过对不同时间窗口的频谱进行叠加,我们可以得到信号在时间和频率上的分布情况,进而分析信号的相位特征。
3. 相位差法相位差法是一种基于相位差的相位分析方法。
它通过将两个同频率的信号进行相位差计算,来分析信号的相位信息。
相位差法常用于音频合成、声源定位等领域。
二、频率分析方法1. 自相关函数法(Autocorrelation)自相关函数法是一种用于估计信号频率的频率分析方法。
它利用信号的自相关函数来估计信号的周期,从而得到信号的频率成分。
自相关函数法适用于周期性信号的频率分析。
2. 峰值检测法(Peak Detection)峰值检测法是一种简单但有效的频率分析方法。
它通过寻找信号频谱中的峰值点来确定信号的频率成分。
峰值检测法常用于音频音调分析、频率测量等场景。
3. 线性预测编码(Linear Predictive Coding, LPC)线性预测编码是一种基于信号模型的频率分析方法。
它通过建立信号的线性预测模型来估计信号的谐波成分和幅度信息。
LPC广泛应用于语音编码、语音合成等领域。
三、相位和频率分析的应用1. 语音识别相位和频率分析在语音识别中起着至关重要的作用。
音乐声音频谱的分析与模拟

音乐声音频谱的分析与模拟音乐作为人类创造的一种艺术形式,不仅能够带给我们美的享受,还能够激发我们的情感和思考。
而在音乐中,声音频谱的分析与模拟是一项重要而有趣的研究领域。
通过对音乐的声音频谱进行深入分析与模拟,我们可以更好地理解音乐的本质和魅力。
在开始音乐声音频谱的分析与模拟之前,我们需要了解声音频谱的基本概念。
声音频谱是指将声音按照不同频率进行分解和显示的图谱。
它能够展示声音中不同频率的分布情况,帮助我们更好地理解声音的结构和特点。
通过分析音乐的声音频谱,我们可以研究音乐中不同音高、音色和音质等元素的表现与变化。
音乐声音频谱的分析可以通过科学仪器和软件工具进行。
一种常用的方法是利用频谱分析器,它通过将声音信号进行傅里叶变换,将时域信号转换为频域信号,然后将其以图像形式展示出来。
通过这种方式,我们可以清晰地看到不同频率的分布情况,从而深入了解音乐的声音特性。
音乐声音频谱的模拟可以通过计算机程序进行。
在计算机软件中,我们可以使用数字信号处理技术,对音频信号进行数字化处理和模拟。
通过调整参数和算法,我们可以改变音乐声音频谱的分布和特点,从而实现对音乐的重新构建和创造。
这种模拟方法不仅可以帮助我们更好地理解音乐声音频谱的特性,还可以用于音乐创作和音乐教育等领域。
音乐声音频谱的分析与模拟对于音乐研究和音乐创作都具有重要意义。
在音乐研究方面,通过对音乐声音频谱的分析,我们可以研究音乐中不同元素之间的关系,探索音乐的结构和形式。
同时,通过对音乐的声音频谱进行模拟,我们可以重新创造音乐,探索新的音乐风格和表现方式。
在音乐创作方面,音乐声音频谱的模拟可以帮助作曲家和音乐制作人更好地理解和运用声音的特点和规律。
通过调整音乐声音频谱的分布和特征,他们可以创造出更具个性和独特的音乐作品。
同时,音乐声音频谱的分析与模拟也可以用于音乐教育中,帮助学生更好地理解音乐的本质和表现形式。
总之,音乐声音频谱的分析与模拟是一项重要而有趣的研究领域。
声音谱分析与声音处理:声音频谱与滤波

声音谱分析与声音处理:声音频谱与滤波声音是我们日常生活中不可或缺的一部分,通过声音可以传达信息、产生情感,也给我们带来了丰富的音乐和娱乐体验。
然而,要深入了解声音的本质和进行声音处理,我们需要掌握声音谱分析与声音滤波的相关知识。
一、声音频谱分析声音的频谱是指将声波信号的频率分解并得到各个频率成分的过程。
通过声音频谱分析,我们可以了解声音的构成、频率分布以及声音功率等信息。
在声音频谱分析中,有一个重要的工具被广泛应用,那就是傅里叶变换。
傅里叶变换可以将一个时域信号转换为频域信号,将声音信号分解为不同频率的正弦波成分。
根据奈奎斯特定理,声音信号的采样频率要大于声音信号中最高频率的两倍,以避免频谱中的混叠。
因此,在进行声音频谱分析时,我们需要先对声音信号进行采样,然后使用傅里叶变换将其转换为频域信号。
通过观察声音频谱图,我们可以判断声音的音调、音量和频率分布。
例如,高音会在高频率范围内有较高的能量,低音则在低频率范围内能量较高。
声音频谱分析不仅适用于音乐和语音处理,还在音频编解码、语音识别等领域发挥着重要作用。
二、声音滤波声音滤波是指通过某种滤波器对声音信号进行处理,可以增强或减弱特定频率成分,改变声音的音色和效果。
常用的声音滤波方法包括低通滤波、高通滤波、带通滤波和带阻滤波等。
1. 低通滤波低通滤波器可以通过滤除高频信号,仅保留低频信号,从而实现声音信号的低音增强或噪音抑制。
低通滤波常用于音乐制作中的低音增强和语音通信中的噪音过滤。
2. 高通滤波高通滤波器则相反,滤除低频信号,增强高频信号。
高通滤波常用于音频处理中的尖锐音效增强和语音识别中的噪音过滤。
3. 带通滤波带通滤波器可以选择滤除或保留某一段频率范围的信号。
通过带通滤波,我们可以突出某一段频率范围内的声音特性,达到特定的音色效果。
4. 带阻滤波带阻滤波器与带通滤波器相反,可以选择滤除或保留某一段频率范围之外的信号。
带阻滤波常用于语音通信中的背景噪音去除以及音频制作中的特殊音效处理。
频谱分析在电脑音乐制作中的辅助作用分析

2017年第13期(总第325期)北 方 音 乐Northern MusicNO.13,2017(CumulativelyNO.325)频谱分析在电脑音乐制作中的辅助作用分析戴姗珊(中国传媒大学,北京 100024)【摘要】随着互联网技术的发展和个人电脑的普及,为声学、特别是音乐声学能够从数字化方面进行研究提供了可能,并形成了以大型研发机构为主,个人及小型机构为辅的发展现状。
而个人数字音频工作站的出现更是使音乐的制作从制作流程和品质上取得了本质性的改变,使得个人完成音乐的作曲、编曲、录音和混音成为了可能。
而频谱分析作为音乐制作工程中重要的音乐制作技术,对电脑音乐制作过程中的辅助作用也十分重要,本文从频谱分析的基本相关概念以及其作用及使用方法进行分析,重点分析其对电脑音乐制作的辅助作用。
【关键词】频谱分析;电脑音乐制作;辅助作用【中图分类号】J614.8 【文献标识码】A一、频谱分析相关的基本含义古语有云:工欲善其事,必先利其器。
若想要熟练地掌握频谱分析辅助电脑音乐制作,就必须对频谱有一定的了解,明白频谱是什么,产生的原理及在电脑音乐制作中所应用的频谱范围,不仅要做到知其然,也同样要做到知其所以然。
频谱分析相关的基本概念分为以下几条:(一)可听频率范围众所周知,声音由振动产生,由介质传递,由人的耳朵对声音进行捕捉,并将其以电信号的形式传到大脑。
而声源振动频率不同,传到人耳当中的声调也不同。
经过科学研究,人类可听频率范围最低为20Hz,最高频率为20kHz(10个八度),而最敏感的感受频率则为2000Hz到5000Hz之间,当然,人的听力是会随着年龄增长及所生活的环境而改变的,但这并不影响音频工程师日常生活中对创作的影响。
(二)泛音当我们听一首曲子时,高低不同的振动频率会给我们带来不一样的听觉感受,这种对不同音乐所产生的不同感受,我们称作高音。
而实际上,我们所听到的音乐是由不同的高音复合而成的复合音,而除我们能辨认出的高音外的其他音乐我们称为泛音。
音乐声音的频谱分析的实验研究与应用

音乐声音的频谱分析的实验研究与应用音乐声音的频谱分析是一种通过对音乐声音进行分析和研究,提取其频谱信息的方法。
在音乐理论和实践中,频谱分析被广泛应用于音乐音色分析、音乐合成、音乐信息检索等方面。
本文将介绍一种基于频谱分析的音乐声音实验研究和应用。
首先,我们需要了解频谱是什么。
频谱是指将声音信号转换为频域表示的过程,用于表示声音信号在不同频率上的能量分布。
通过对音乐声音进行频谱分析,我们可以获取音乐信号在不同频率上的强度信息,从而了解音乐的音色特征。
在实验研究中,我们可以使用频谱分析仪等仪器对音乐声音进行频谱分析。
首先,我们将音乐声音输入到频谱分析仪中,该仪器将音乐信号转换为频谱表示,并显示在屏幕上。
通过观察频谱图,我们可以看到不同频率上的能量分布情况,进而了解音乐的音色特征。
在应用方面,频谱分析在音乐音色分析中扮演着重要的角色。
音色是指不同乐器或声音在听觉上的差异,它是由乐器或声音产生的谐波成分和相对分量的组合所决定的。
通过频谱分析,我们可以观察到音乐信号在不同频率上的能量分布情况,从而识别出不同乐器声音之间的差异,进而进行音乐音色的分类和分析。
例如,在音乐合成领域,频谱分析可以用于模拟和合成出不同乐器的声音,从而丰富合成音乐的音色特征。
此外,频谱分析还可以应用于音乐信息检索。
音乐信息检索是指通过计算机技术对音乐进行分类、检索和推荐的研究领域。
通过对音乐信号进行频谱分析,可以提取音乐的特征向量,然后将其与数据库中的音乐进行比对,实现音乐的自动分类和检索。
例如,在音乐推荐系统中,可以通过分析用户喜好的音乐的频谱特征,推荐给用户与其音乐口味相似的音乐。
总而言之,音乐声音的频谱分析是一种重要的实验研究和应用方法,可以通过提取音乐信号在不同频率上的能量分布来研究音乐的音色特征,并应用于音乐合成、音乐信息检索等领域。
未来,随着科技的进步和研究的深入,频谱分析在音乐领域的应用将会更加广泛和深入。
在音乐声音的频谱分析中,还有一些相关的实验研究和应用值得探讨和深入研究。
音乐信号频谱分析

利用双线性变换设 计IIR滤波器( 巴特 沃斯数字低通滤波 器的设计)",首先 要设计出满足指标
要求的模拟滤波器 的传递函数Ha(s), 然后由Ha(s)通过双 线性变换可得所要 设计的IIR滤波器的
系统函数H(z)
如果给定的指标为 数字滤波器的指标, 则首先要转换成模 拟滤波器的技术指 标,这里主要是边 界频率Wp和Ws的转 换,对ap和as指标
2.语音信号的采集
但过高的采样频率并不可取,对固定长 度(T)的信号,采集到过大的数据量 (N=T/△t),给计算机增加不必要的计算 工作量和存储空间
若数据量(N)限定,则采样时间过短,会 导致一些数据信息被排斥在外
采样频率过低,采样点间隔过远,则离 散信号不足以反映原有信号波形特征, 无法使信号复原,造成信号混淆
3.低通滤波器的设计
plot(x2)
subplot(2,1,2)
title('IIR低通滤波器 滤波后的时域波形')
%画出滤波前的时域图 plot(fl) sound(fl, 44100)
title('IIR低通滤波器 滤波前的时域波形')
%画出滤波后的时域图
%播放滤波后的信号
3.低通滤波器的设计
1 散的数字语音信号
采样也称抽样,是信号在时间上的离散化,即按照一定时间间隔△t在模拟信号x(t)上逐点采取其瞬时
2值
采样时必须要注意满足奈奎斯特定理,即采样频率fs必须以高于受测信号的最高频率两倍以上的速度进
3 行取样,才能正确地重建波它是通过采样脉冲和模拟信号相乘来实现的 4 在采样的过程中应注意采样间隔的选择和信号混淆:对模拟信号采样首先要确定采样间隔 5 如何合理选择△t涉及到许多需要考虑的技术因素 6 一般而言,采样频率越高,采样点数就越密,所得离散信号就越逼近于原信号
《乐音的特性》频谱分析,乐音奥秘

《乐音的特性》频谱分析,乐音奥秘当我们沉浸在美妙的音乐中时,是否曾想过,是什么让这些声音如此动人,如此富有魅力?答案就藏在乐音的特性之中。
乐音,作为一种能够给人带来愉悦感受的声音,其具有独特的性质,而通过频谱分析,我们能够更深入地揭开乐音的神秘面纱。
首先,让我们来了解一下乐音的三个主要特性:音高、响度和音色。
音高,是我们在聆听音乐时最直观感受到的特性之一。
它决定了我们所听到的声音是高音还是低音。
从物理学的角度来看,音高与声音的频率紧密相关。
频率越高,音高就越高;频率越低,音高则越低。
例如,小提琴演奏出的高音和大提琴演奏出的低音,就是由于它们所产生的声波频率不同所致。
在乐谱中,我们通过音符的位置来表示不同的音高,而在乐器演奏中,演奏者通过调整弦的长度、管的长度或者按键的位置等方式来改变音高。
响度,简单来说就是声音的强弱。
它取决于声音的振幅大小。
振幅越大,声音就越响亮;振幅越小,声音则越轻柔。
想象一下,在一场交响音乐会中,当整个乐团全力演奏时,那宏大而响亮的声音能够震撼人心;而当独奏乐器轻柔地演奏时,那微弱而细腻的声音又能营造出一种宁静的氛围。
在日常生活中,我们调节音量的大小,实际上就是在改变声音的响度。
音色,是乐音最具魅力和个性的特性。
即使两个音具有相同的音高和响度,但由于音色的不同,我们仍然能够轻易地区分它们。
比如,钢琴和吉他弹奏出相同的音符,我们可以清晰地辨别出哪一个是钢琴的声音,哪一个是吉他的声音。
音色的差异主要源于声音中所含的谐波成分以及它们的相对强度。
不同的乐器、不同的人声,由于发声的原理和结构不同,产生的谐波也各不相同,从而形成了各自独特的音色。
接下来,让我们深入到频谱分析的领域,看看它如何帮助我们理解乐音的特性。
频谱分析是一种将声音分解为不同频率成分的技术。
通过对乐音进行频谱分析,我们可以直观地看到声音中包含的各种频率及其强度。
对于音高的分析,频谱图能够清晰地显示出主要频率的位置。
比如,一个特定的高音,在频谱图上会呈现出较高频率处的能量集中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序如下:#include <iom16v.h>#include <macros.h>#include<math.h>#define N 128#define PI 3.141592653589#define uchar unsigned char#define uint unsigned inttypedef struct{int real;int img;}complex;void initw(); //初始化旋转因子void bitReverse(); //比特反转void FFT();complex x[N];uchar vis[N];void delayms(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<3;j++);}}void FFT(){int i,j,k,t,P,B,m;complex up,down,product;for (i=0;i<7;i++){B=1<<i;for (j=0;j<B;j++){t=1<<(6-i);P=t*j;for (k=j;k<N;k=k+2*B){complex product;product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N); product.img=x[k+B].real*(-1)* sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N); x[k+B].real=x[k].real-product.real;x[k+B].img=x[k].img-product.img;x[k].real=x[k].real+product.real;x[k].img=x[k].img+product.img;}}}}void initw() //初始化旋转因子{int i;for (i=0;i<N;i++)vis[i]=0;}void bitReverse() //比特反转{int i,j=0;int k=0;int q=0;complex tmp3;for (i=0;i<N;i++){int tmp=i,tmp2=0,j;for(j=0;j<7;j++)tmp2+=((tmp>>j)&1)*(1<<(6-j)); if(vis[i]==0){tmp3=x[i];x[i]=x[tmp2];x[tmp2]=tmp3;vis[i]=1;vis[tmp2]=1;}}}void main(){uchar ii,y;float tmp;for (ii=0;ii<20;ii++){x[ii].real=3;x[ii].img=0;}for (ii=20;ii<128;ii++) {x[ii].real=0;x[ii].img=0;}initw();bitReverse();FFT();while(1);}/showpic.html -blogid=61aa4e9d0100sjy6&url=/orignal/61aa4e9dxa99056ccb1e7上图是8点FFT运算,按照上图的流程所示,FFT运算主要有两步,一步是比特反转,就是右边不是按照0、1、2、3……这样顺序进行计算的,而左边是的,两边的关系就是进行一个比特反转。
可以看到右边0对应二进制为000,左边对应二进制为000,右边1二进制001,左边4对应二进制100,依次下去,可以清楚看到,对于8位FFT运算,对应二进制有三位,而左右两边的关系恰巧是按照中间位进行了个反转。
FFT运算第二步就是乘以旋转因子,注意的是这里是复数运算,虚部和实部都要加入运算。
乘以旋转因子后对进行加减运算得到新的值,依次下去得到最终解。
由于单片机内存的限制,因而对于传统的FFT算法,我进行了些改进,原则就是尽量地少使用变量,一个变量可以重复的使用是最理想的了,大家可以在程序中看出。
个人意见这是能节省变量最少的了,如果有好的方法,希望可以告诉我下,我的邮箱是albertvictordu@,谢谢!下面是12864液晶驱动程序的写法:LCD12864液晶,即像素为128*64的显示液晶。
它的每一行横向一共有128个可显示点,每一列纵向有64个,这些“点”其实也都是一个个发光二极管。
它可以在一个16*16的点阵区域上显示一个中文,也可以在一个8*16的点阵区域显示一个非中文字符,一般称为半宽字体。
即一个中文字所占显示面积是一个非中文字符的两倍。
关于驱动函数的书写,是液晶显示的基础,整个液晶驱动主要有四个函数组成:1、写命令函数;2、写数据函数;3、读状态函数;4、读数据函数;这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。
另外关于读状态函数,其实也就是用于判忙操作,原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。
因此,读状态函数也可以不写,只用简短的延时函数替换即可。
单片机用于控制LCD的管脚主要为RS、RW和E管脚,分别的功能是RS为0时,对应单片机访问的是命令寄存器,为1时对应数据寄存器;RW为1时,对应单片机操作为读操作,为0时对应单片机为写操作;E是使能信号。
读操作如下图所示写操作如下图所示在12864液晶中,开发商将一些基本指令已经写入到命令寄存器中,我们调用该指令就可以完成相应的功能。
LCD初始化初始化操作如下:1.芯片上电;2.延时40ms以上;3.复位操作:RST出现一个上升沿(RST=1;RST=0;RST=1;);4.功能设定;5.延时100us以上;6.再次进行功能设定;7.延时37us;8.显示开关控制;9.延时100us以上;10.清除显示;11.延时10ms以上;12.进入点设置;13.初始化结束;LCD液晶屏初始化过程如图所示为:打点函数打点函数是创建GUI的基础,打点函数的书写分为以下几个步骤:1.进入扩展模式2.写入打点地址3.读取该地址的数据4.修改该地址的数据5.将修改后的数据输入LCD中6.进入普通模式GDRAM地址分布情况,需要注意的是横纵坐标的起始地址都是0x80,还有上下半屏的横坐标是不一样的,下半屏的横坐标要加上0x08,而纵坐标跟对应的上半屏的纵坐标是一样的。
GDRAM地址分布图,如图所示。
下面的函数是12864与FFT算法的一个结合,里面设置了一个门函数,12864上显示的结果则是一个sinc函数,证明结果是正确的。
#include <iom16v.h>#include <macros.h>#include<math.h>#define N 128#define PI 3.141592653589#define uchar unsigned char#define uint unsigned int#define RS (1<<4)#define RW (1<<5)#define EN (1<<6)//typedef struct{int real;int img;}complex;void initw(); //初始化旋转因子void bitReverse(); //比特反转void FFT();complex x[N];uchar vis[N];void delayms(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<3;j++);}}//此处定义字符串//写数据void WriteDataLCM(unsigned char WDLCM) //写数据函数{// ReadStatusLCM(); //检测忙delayms(1);PORTA|=RS; //RS=1delayms(1);PORTA&=~RW; //RW=0delayms(1);PORTA|=EN; //EN=1delayms(1);PORTB=WDLCM; //输出数据delayms(1);PORTA&=~EN; //EN=0delayms(1);}//写指令void WriteCommandLCM(unsigned char WCLCM) //写命令函数{// ReadStatusLCM(); //根据需要检测忙delayms(1);PORTA&=~RS; //RS=0delayms(1);PORTA&=~RW; //RW=0delayms(1);PORTA|=EN; //EN=1delayms(1);PORTB=WCLCM; //输出指令delayms(1);PORTA&=~EN; //EN=0delayms(1);}//读状态:检测忙void ReadStatusLCM() //读状态函数{uchar temp;uchar flag = 1;while(flag==1){PORTB=0xff;delayms(1);DDRB=0x00; //端口B改为输入delayms(1);PORTA&=~RS; //RS=0delayms(1);PORTA|=RW; //RW=1delayms(1);PORTA|=EN; //EN=1delayms(10);temp = PINB; //读端口Bdelayms(10);DDRB=0xff; //端口B改为delayms(10);PORTA&=~EN; //EN=0delayms(1);if(temp>>7==0)flag = 0;}}uchar read_data() //读数据函数{uchar lcd_data;PORTB=0xff;DDRB=0x00;PORTA|=RW;PORTA|=RS;delayms(10);PORTA|=EN;delayms(10);lcd_data=PINB;delayms(10);PORTA&=~EN;DDRB=0xff;return(lcd_data) ;}void point(uchar x,uchar y) //打点函数,最重要的函数,GUI的基础{uchar x_Dyte,x_byte;uchar y_Dyte,y_byte;uchar GDRAM_hbit,GDRAM_lbit;WriteCommandLCM(0x36);x_Dyte=x/16;x_byte=x&0x0f;y_Dyte=y/32;y_byte=y&0x1f;WriteCommandLCM(0x80+y_byte);WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);read_data();GDRAM_hbit=read_data();GDRAM_lbit=read_data();delayms(10);WriteCommandLCM(0x80+y_byte);WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);delayms(10);if(x_byte<8){WriteDataLCM(GDRAM_hbit|(0x01<<(7-x_byte)));WriteDataLCM(GDRAM_lbit);}else{WriteDataLCM(GDRAM_hbit);WriteDataLCM(GDRAM_lbit|(0x01<<(15-x_byte)));}WriteCommandLCM(0x30);}//LCM初始化void LCMInit(void){WriteCommandLCM(0x30); //三次显示模式设置,不检测忙信号delayms(10);WriteCommandLCM(0x30);delayms(10);WriteCommandLCM(0x30);delayms(10);WriteCommandLCM(0x30); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08); //关闭显示WriteCommandLCM(0x01); //显示清屏WriteCommandLCM(0x06); //显示光标移动设置WriteCommandLCM(0x0C); //显示开及光标设置}void clear(uchar dat) //清屏函数{uchar i,j,k;uchar addr=0x80;for(i=0;i<2;i++){for(j=0;j<32;j++){for(k=0;k<8;k++){WriteCommandLCM(0x36); WriteCommandLCM(0x80+j); WriteCommandLCM(addr+k); WriteDataLCM(dat);WriteDataLCM(dat);}}addr=0x88;}WriteCommandLCM(0x36); WriteCommandLCM(0x30); }void heng(uchar a){uchar i;for(i=0;i<127;i++)point(i,a);}void su(uchar a){uchar i;for(i=0;i<63;i++)point(a,i);}void FFT(){int i,j,k,t,P,B,m;complex up,down,product;for (i=0;i<7;i++){B=1<<i;for (j=0;j<B;j++){t=1<<(6-i);P=t*j;for (k=j;k<N;k=k+2*B){complex product;product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N); product.img=x[k+B].real*(-1)* sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N); x[k+B].real=x[k].real-product.real;x[k+B].img=x[k].img-product.img;x[k].real=x[k].real+product.real;x[k].img=x[k].img+product.img;}}}}void initw() //初始化旋转因子{int i;for (i=0;i<N;i++)vis[i]=0;}void bitReverse() //比特反转{int i,j=0;int k=0;int q=0;complex tmp3;for (i=0;i<N;i++){int tmp=i,tmp2=0,j;for(j=0;j<7;j++)tmp2+=((tmp>>j)&1)*(1<<(6-j)); if(vis[i]==0){tmp3=x[i];x[i]=x[tmp2];x[tmp2]=tmp3;vis[i]=1;vis[tmp2]=1;}}}void xian(uchar x,uchar y){uchar i;for(i=63;i>=y;i--)point(x,i);}//主函数void main(void){uchar ii,y;float tmp;//端口初始化DDRA=0xff;PORTA=0xff;DDRB=0xff;PORTB=0xff;DDRD=0xff;PORTD=0x00;delayms(20);delayms(20);LCMInit(); //LCM初始化 //液晶初始化delayms(100);clear(0x00);heng(0);heng(63);su(0);su(127);for (ii=0;ii<20;ii++){x[ii].real=3;x[ii].img=0;}for (ii=20;ii<128;ii++){x[ii].real=0;x[ii].img=0;}initw();bitReverse();FFT();for(ii=64;ii<128;ii++){tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img)); y= 63-(int)tmp;point(ii-64,y);xian(ii-64,y);}for(ii=0;ii<64;ii++){tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img)); y= 63-(int)tmp;point(ii+64,y);xian(ii+64,y);}while(1);}得到的图片:MATLAB仿真图形:。