0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MATLAB学习笔记之傅里叶变换2

jf_78858299 来源:滑小稽笔记 作者:电子技术园地 2023-02-24 14:47 次阅读

1.3.3 源代码分析

(1)创建74HC595驱动

<1>创建74hc595.h并输入以下代码。

#ifndef _74HC595_H_
#define _74HC595_H_
#include "sys.h"
sbit HC595_CLK_X = P0^3 ;                      //X轴595时钟
sbit HC595_DAT_X = P0^4 ;                      //X轴595数据
sbit HC595_RCK_X = P0^5 ;                      //X轴595锁存
sbit DB16_X      = P0^6 ;                      //增补X轴脚
sbit HC595_CLK_Y = P0^0 ;                      //Y轴595时钟
sbit HC595_DAT_Y = P0^1 ;                      //Y轴595数据
sbit HC595_RCK_Y = P0^2 ;                      //Y轴595锁存
void HC595_X_Dat( u16 dat ) ;                    //74HC595横坐标数据
void HC595_Y_Dat( u16 dat ) ;                    //74HC595纵坐标数据
#endif

<2>创建74hc595.c并输入以下代码。

#include " 74hc595.h "
/********************************************************
Name    :HC595_X_Dat
Function  :74HC595横坐标数据
Paramater  :
      dat:写入的数据
Return    :None
********************************************************/
void HC595_X_Dat( u16 dat )
{
  u8 i ;
  for( i=0 ; i<16 ; i++ )
  {
    if( dat&0x8000 )
      HC595_DAT_X = 1 ;
    else
      HC595_DAT_X = 0 ;
    dat <<= 1 ;
    HC595_CLK_X = 0 ;
    HC595_CLK_X = 1 ;
  }
  HC595_RCK_X = 0 ;
  HC595_RCK_X = 1 ;
}
/********************************************************
Name    :HC595_Y_Dat
Function  :74HC595纵坐标数据
Paramater  :
      dat:写入的数据
Return    :None
********************************************************/
void HC595_Y_Dat( u16 dat )
{
  u8 i ;
  for( i=0 ; i<16 ; i++ )
  {
    if( dat&0x8000 )
      HC595_DAT_Y = 1 ;
    else
      HC595_DAT_Y = 0 ;
    dat <<= 1 ;
    HC595_CLK_Y = 0 ;
    HC595_CLK_Y = 1 ;
  }
  HC595_RCK_Y = 0 ;
  HC595_RCK_Y = 1 ;
}

(2)移植FFT算法

<1>创建fft.h并输入以下代码。

#ifndef _FFT_H_
#define _FFT_H_


#include "sys.h"
/*********************************************************************************************************
                    函    数    列    表
*********************************************************************************************************/
void FFT_Init( void ) ;                                          //FFT初始化
void FFT_Sample( void ) ;                                        //FFT采样计算(128位)


#endif

<2>创建fft.c并输入以下代码。

/*********************************************************************************************************
            FFT    算    法    驱    动    代    码
*********************************************************************************************************/
#include "fft.h"
#include "intrins.h"
#include "math.h"
#include "74hc595.h"


//采样存储序列表
unsigned char code BRTable[128] ={
0, 64, 32, 96, 16, 80, 48, 112,
8, 72, 40, 104, 24, 88, 56, 120,
4, 68, 36, 100, 20, 84, 52, 116,
12, 76, 44, 108, 28, 92, 60, 124,
2, 66, 34, 98, 18, 82, 50, 114,
10, 74, 42, 106, 26, 90, 58, 122,
6, 70, 38, 102, 22, 86, 54, 118,
14, 78, 46, 110, 30, 94, 62, 126,
1, 65, 33, 97, 17, 81, 49, 113,
9, 73, 41, 105, 25, 89, 57, 121,
5, 69, 37, 101, 21, 85, 53, 117,
13, 77, 45, 109, 29, 93, 61, 125,
3, 67, 35, 99, 19, 83, 51, 115,
11, 75, 43, 107, 27, 91, 59, 123,
7, 71, 39, 103, 23, 87, 55, 119,
15, 79, 47, 111, 31, 95, 63, 127};
char code sin_tabb[128] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102, 
105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 
108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, 
-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, 
-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, 
-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6};                         
char code cos_tabb[128] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94, 
89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59, 
-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -
126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80, 
-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 
75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126};
xdata unsigned char result[128];
xdata unsigned char temp[128];
xdata unsigned char num[128];
unsigned char timernum;//用于分离
int xdata FftReal[128];
int xdata FftImage[128];
u16 code HC_FFT_TAB_X[] = {
0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
} ;                                                    //FFT列选
u16 code HC_FFT_TAB_Y[] = {
0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFE0, 0xFFC0, 0xFF80, 0xFF00,
0xFE00, 0xFC00, 0xF800, 0xF000, 0xE000, 0xC000, 0x8000, 0x0000,
} ;                                                    //FFT行选模式
/********************************************************
Name    :ADC_Init
Function  :ADC模块初始化
Paramater  :None
Return    :None
********************************************************/
void ADC_Init()
{
  P1ASF = 0x01 ;
  ADC_CONTR = 0xE0 ;
}
/********************************************************
Name    :ADC_Read_Byte
Function  :ADC读取10位字节
Paramater  :None
Return    :转换结果的10位数据
********************************************************/
float ADC_Read_Byte()
{
  ADC_CONTR = 0xE8 ;
  _nop_() ;
  _nop_() ;
  _nop_() ;
  _nop_() ;
  while ( !( ADC_CONTR&0x10 ) ) ;
  return ( ADC_RES*4+ADC_RESL ) ;
}
/********************************************************
Name    :FFT_Init
Function  :FFT初始化
Paramater  :None
Return    :None
********************************************************/
void FFT_Init()
{
  ADC_Init();
  IE |= 0x82 ;
  TMOD |= 0x01 ;
  TH0 = ( 65535-2048 ) / 256 ;
  TL0 = ( 65535-2048 ) % 256 ;
  TR0 = 1 ;
  P0M0 = 0x40 ;
}
/********************************************************
Name    :FFT_process
Function  :下落迟滞
Paramater  :None
Return    :None
********************************************************/
void FFT_process()
{
  u8 i ;
  for( i=0; i<17; i++ )
  {
    if( result[ i ]>7 )+( ( FftImage[ k+bb ]*sin_tabb[ p ] )>>7 ) ;
        FftImage[ k ] = FftImage[ k ] - ( ( FftReal[ k+bb ]*sin_tabb[ p ] )>>7 )+( ( FftImage[ k+bb ]*cos_tabb[ p ] )>>7 ) ;
        //对称幅值计算
        FftReal[ k+bb ] = TR -( ( FftReal[ k+bb ]*cos_tabb[ p ] )>>7 )-( ( FftImage[ k+bb ]*sin_tabb[ p ] )>>7 ) ;
        FftImage[ k+bb ] = TI + ( ( temp*sin_tabb[ p ] )>>7 )-( ( FftImage[ k+bb ]*cos_tabb[ p ] )>>7 ) ;
        //除以2
        FftReal[ k ] >>= 1 ;
        FftImage[ k ] >>= 1 ;
        FftReal[ k+bb ] >>= 1 ;
        FftImage[ k+bb ] >>= 1 ;
            }
        }
    }
  //转换为余弦形式
  for( i=0; i<17; i++ )
  {  
    ulReal = FftReal[ i+1 ] ;                                    //获取实部
    ulReal *= ulReal ;                                        //计算实部平方
    ulImage = FftImage[ i+1 ] ;                                    //获取虚部
    ulImage *= ulImage ;                                      //计算虚部平方
    result[ i ] = sqrt( ulReal+ulImage )*4 ;                            //计算模值
  }
}
/********************************************************
Name    :FFT_Disp
Function  :FFT数据显示
Paramater  :None
Return    :None
********************************************************/
void FFT_Disp()
{
  FFT_process() ;
  if( result[ timernum ]>=16 )
    result[ timernum ] = 15 ;
  if( timernum<16 )
  {
    HC595_X_Dat( HC_FFT_TAB_X[ timernum ] ) ;
    DB16_X = 0 ;
  }
  else
  {
    HC595_X_Dat( 0x0000 ) ;
    DB16_X = 1 ;
  }
  HC595_Y_Dat( HC_FFT_TAB_Y[ result[ timernum ] ] ) ;
  timernum ++ ;
  if( timernum==17 ) 
    timernum = 0 ;
}
/********************************************************
Name    :TIM0
Function  :定时器0中断服务函数
Paramater  :None
Return    :None
********************************************************/
void TIM0() interrupt 1
{
  u8 i , t ;
  TH0 = ( 65535-2048 ) / 256 ;
  TL0 = ( 65535-2048 ) % 256 ;
  t ++ ;
  if( t==17 )
  {
    for( i=0 ; i<17 ; i++ )
      temp[ i ] = result[ i ] ;
    t = 0;
  }
  FFT_Disp() ;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230134
  • 线性
    +关注

    关注

    0

    文章

    196

    浏览量

    25128
  • 傅里叶变换
    +关注

    关注

    6

    文章

    437

    浏览量

    42562
收藏 人收藏

    评论

    相关推荐

    图像频率域分析傅里叶变换

    文章目录傅里叶变换基础傅里叶级数傅里叶积分傅里叶变换一维连续傅里叶变换一维离散傅里叶变换二维离散傅里叶变换
    发表于 05-22 07:41

    学习傅里叶变换意义和方法

    学习傅里叶变换需要面对大量的数学公式,数学功底较差的同学听到傅里叶变换就头疼。事实上,许多数学功底好的数字信号处理专业的同学也不一定理解傅里叶变换的真实含义,不能做到学以致用!事实上,
    发表于 06-28 07:31

    傅里叶变换是什么?如何求傅里叶变换

    傅里叶变换是什么?三傅里叶变换的意义是什么?如何求傅里叶变换
    发表于 05-08 09:23

    DSP变换运算-傅里叶变换

    第24章 DSP变换运算-傅里叶变换本章节开始进入此教程最重要的知识点之一傅里叶变换。关于傅里叶变换,本章主要是把傅里叶相关的基础知识进行必要的介绍,没有这些基础知识的话,后面
    发表于 08-03 06:14

    傅立叶变换matlab实现

    有关傅里叶变换matlab教程,简单明了。
    发表于 02-23 18:22 0次下载

    深入浅出的学习傅里叶变换

    见过的介绍傅里叶变换的很好的文章,通俗易懂,转发的,学习
    发表于 04-29 14:12 10次下载

    小波变换傅里叶变换好在哪里_小波变换傅里叶变换详解

    小波变换傅里叶变换有什么区别吗?小波变换傅里叶变换哪个好?我们通过小波变换傅里叶变换的详细
    发表于 01-13 11:02 1.6w次阅读
    小波<b class='flag-5'>变换</b>比<b class='flag-5'>傅里叶变换</b>好在哪里_小波<b class='flag-5'>变换</b>与<b class='flag-5'>傅里叶变换</b>详解

    时频分析短时傅里叶变换STFT资源下载

    时频分析短时傅里叶变换STFT资源下载
    发表于 04-26 11:35 7次下载

    MATLAB学习笔记傅里叶变换1

    线性时不变系统** (输入信号与输出信号满足线性关系,且系统参数不随时间变换),无论你采用微分方程或者传递函数还是状态空间,所以可以说正弦信号是系统的特征向量,当然指数信号也是系统的特征向量,用于
    的头像 发表于 02-24 14:46 4053次阅读
    <b class='flag-5'>MATLAB</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>傅里叶变换</b>1

    傅里叶变换如何用于深度学习领域

    机器学习和深度学习中的模型都是遵循数学函数的方式创建的。从数据分析到预测建模,一般情况下都会有数学原理的支撑,比如:欧几里得距离用于检测聚类中的聚类。 傅里叶变换是一种众所周知的将函数从一个域转换
    的头像 发表于 06-14 10:01 1261次阅读
    <b class='flag-5'>傅里叶变换</b>如何用于深度<b class='flag-5'>学习</b>领域

    深入浅出的学习傅里叶变换

    学习傅里叶变换需要面对大量的数学公式,数学功底较差的同学听到傅里叶变换就头疼
    的头像 发表于 07-07 14:15 631次阅读
    深入浅出的<b class='flag-5'>学习</b><b class='flag-5'>傅里叶变换</b>

    Matlab实现傅里叶变换的步骤

    傅里叶变换是将按时间或空间采样的信号与按频率采样的相同信号进行关联的数学公式。
    的头像 发表于 07-19 17:47 5061次阅读
    <b class='flag-5'>Matlab</b>实现<b class='flag-5'>傅里叶变换</b>的步骤

    傅里叶变换基本性质 傅里叶变换本质 傅里叶变换的应用

    各个领域都有广泛的应用。本文将详细介绍傅里叶变换的基本性质、本质和应用。 一、傅里叶变换的基本性质 1. 线性性:若f1(t)与f2(t)的傅里叶变换分别为F1(f)和F
    的头像 发表于 09-07 16:18 6461次阅读

    傅里叶变换的定义 傅里叶变换的意义

    傅里叶变换的定义 傅里叶变换的意义  傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。 在不同的研究领域,傅里叶变换具有多种不同
    的头像 发表于 11-30 15:32 1938次阅读

    傅里叶变换基本原理及在机器学习应用

    连续傅里叶变换(CFT)和离散傅里叶变换(DFT)是两个常见的变体。CFT用于连续信号,而DFT应用于离散信号,使其与数字数据和机器学习任务更加相关。
    发表于 03-20 11:15 849次阅读
    <b class='flag-5'>傅里叶变换</b>基本原理及在机器<b class='flag-5'>学习</b>应用