チーム13B4
課題名
フーリエ級数展開の応用
研究者名
3年15組45番 二三四一道
見出し1
見出し1に対する内容や説明文などを書いてください。
概要
フーリエ級数式をプログラムで実装し、配列に数値を入れる。それを、DMAを使用して、WSで観測を行う。
また、次元数をdefineで定義し、その次元数分足しこんで、表現できるようにしている。
WS
矩形波 次元数1
矩形波 次元数100
のこぎり波 次元数100
のこぎり波2 次元数100
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