チーム13B4

課題名

フーリエ級数展開の応用

研究者名

3年15組45番 二三四一道

見出し1

見出し1に対する内容や説明文などを書いてください。

概要

フーリエ級数式をプログラムで実装し、配列に数値を入れる。それを、DMAを使用して、WSで観測を行う。
また、次元数をdefineで定義し、その次元数分足しこんで、表現できるようにしている。

WS


矩形波2014_次元数1.png
矩形波 次元数1

矩形波2_2014.png
矩形波 次元数100

のこぎりは2_2014.png
のこぎり波 次元数100

のこぎりは2014.png
のこぎり波2 次元数100

pin.png
pinの配置

プログラム

#include <stdio.h>
#include <device.h>
#include <math.h>

 //次元数
#define RANK 1

 //配列の大きさ
#define SIZE 100


double y = (double) 360/SIZE;
double y2 = (double) 540 /SIZE;

 //使用する配列
 //ここに、数値を入れる
uint8 kukei[SIZE];


void make_kukei(void);
void make_sawtooth_wave2(void);
void make_sawtooth_wave1(void);
void make_triangle_wave(void);

void main()
{
 //関数で波形を合成する
  make_sawtooth_wave2();
   
   /* Place your initialization/startup code here (e.g. MyInst_Start()) */
   uint8 DMA_1_Chan;
   uint8 DMA_1_TD[1];
   /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
   #define DMA_1_BYTES_PER_BURST 1
   #define DMA_1_REQUEST_PER_BURST 1
   #define DMA_1_SRC_BASE (CYDEV_SRAM_BASE)
   #define DMA_1_DST_BASE (CYDEV_PERIPH_BASE)
   
   DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST,
   DMA_1_REQUEST_PER_BURST,
   HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE));
   DMA_1_TD[0] = CyDmaTdAllocate();
   CyDmaTdSetConfiguration(DMA_1_TD[0], sizeof(kukei), DMA_1_TD[0],
   TD_INC_SRC_ADR);
   CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)kukei),
   LO16((uint32)VDAC8_1_Data_PTR));
   CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]);
   CyDmaChEnable(DMA_1_Chan, 1);
   
   VDAC8_1_Start();
   
   for(;;)
   {
       /* Place your application code here. */
   }
}

 //矩形波
void make_kukei(){
  int i, j;
   double x;

  for(i=0; i<SIZE; i++){
       if(i == 0){
           kukei[i] = 0;
           continue;
       }
       else{
           x = (double) 360 / (y*i);
       }
       for(j=0; j<RANK; j++){
           kukei[i] = kukei[i] + (uint8) ((((double) 1/ (2*j +1)) * sin((2*j +1)*(2*M_PI) / x)+1)*100);
       }
       kukei[i] = (4 / M_PI) * kukei[i] ;

      //printf("%f ", kukei[i]);
   }
}

 //のこぎりは
void make_sawtooth_wave2(void){
  int i, j;
   double x;

  for(i=0; i<SIZE; i++){
       if(i == 0){
           kukei[i] = 0;
           continue;
       }
       else{
           x = (double) 360 / (y*i);
       }
       for(j=0; j<RANK; j++){
           kukei[i] = kukei[i] + (uint8)(((sin((j+1)*(2*M_PI) / x) / (j+1))+1)*100);
       }
       //kukei[i] =kukei[i];

      //printf("%f ", kukei[i]);
   }

}

 //三角波(未完成)
void make_triangle_wave(void){
  int i, j;
   double x;

  for(i=0; i<SIZE; i++){
       if(i == 0){
           kukei[i] = 0;
           continue;
       }
       else{
           x = (double) 360 / (y*i);
       }
       for(j=0; j<RANK; j++){
           kukei[i] = kukei[i] + (uint8) (((cos(((2*j+1)*(2*j+1))*(2*M_PI) / x) / ((2*j+1)*(2*j+1))))*100);
       }
       kukei[i] = (uint8)((M_PI/2)*100) - (4*kukei[i]) / (M_PI*10);

      //printf("%f ", kukei[i]);
   }
}

 //のこぎりは
void make_sawtooth_wave1(void){
  int i, j;
   double x;

  for(i=0; i<SIZE; i++){
       if(i == 0){
           kukei[i] = 0;
           continue;
       }
       else{
           x = (double) 360 / (y*i);
       }
       for(j=0; j<RANK; j++){
           if(j %2 == 0)
               kukei[i] = kukei[i] + (uint8)(((sin((j+1)*(2*M_PI) / x) / (j+1))+1)*100);
           else
               kukei[i] = kukei[i] - (uint8)(((sin((j+1)*(2*M_PI) / x) / (j+1))+1)*100);
       }
       //kukei[i] =kukei[i];

      //printf("%f ", kukei[i]);
   }
}
/* [] END OF FILE */


見出しN

見出しNに対する内容や説明文などを書いてください。

考察

特にのこぎり波でノイズが入ってしまった。
これは、範囲を0~2πでとっているためである。
のこぎり波では、-π~πで f(x)=x となっているため、その範囲でずれてしまう。
それを無理に合わせているため、ずれが生じてしまうと考えられる。

また、数値の問題ではなく、機械の問題だとも考えることができる.


double型からuint8にキャストする際に、数値にずれが生じてしまうため、注意が必要であった。

  • 最終更新:2014-01-06 16:57:02

このWIKIを編集するにはパスワード入力が必要です

認証パスワード