WAVE头文件分析
嵌入式CC++面试题(转帖)

嵌⼊式CC++⾯试题(转帖)1.引⾔ 本⽂的写作⽬的并不在于提供C/C++程序员求职⾯试指导,⽽旨在从技术上分析⾯试题的内涵。
⽂中的⼤多数⾯试题来⾃各⼤论坛,部分试题解答也参考了⽹友的意见。
许多⾯试题看似简单,却需要深厚的基本功才能给出完美的解答。
企业要求⾯试者写⼀个最简单的strcpy函数都可看出⾯试者在技术上究竟达到了怎样的程度,我们能真正写好⼀个strcpy函数吗?我们都觉得⾃⼰能,可是我们写出的strcpy很可能只能拿到10分中的2分。
读者可从本⽂看到strcpy函数从2分到10分解答的例⼦,看看⾃⼰属于什么样的层次。
此外,还有⼀些⾯试题考查⾯试者敏捷的思维能⼒。
分析这些⾯试题,本⾝包含很强的趣味性;⽽作为⼀名研发⼈员,通过对这些⾯试题的深⼊剖析则可进⼀步增强⾃⾝的内功。
2.找错题 试题1:void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );} 试题2:void test2(){ char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy( string, str1 );} 试题3:void test3(char* str1){ char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); }} 解答: 试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),⽽string只有10个字节的空间,strcpy会导致数组越界; 对试题2,如果⾯试者指出字符数组str1不能在数组内结束可以给3分;如果⾯试者指出strcpy(string, str1)调⽤使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy⼯作⽅式的给10分; 对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占⽤的1个字节。
CW软件操作手册

more file.bin
sushw < data.su key=sx a=6400 c
suplane |sushw key=sx a=6400 c=-100 j=5 | sugethw key=sx | more
make sfinstall
这期间可能有系统安装所等待的时间,不用急,但凡遇到yes/no,一路y下来即可;
四.为了检查是否安装完毕,在终端中输入
Suplane > data.su
Suxwigb < data.su &
若出现一个简单的图像,则成功
CWP软件的简单说明
一、文中涉及的命令全部以小写形式,均可在终端窗口下输入,以次获取自述帮助;
sscale=1=1 to divide output samples by NMO stretch factor
suaddhead---put headers on bare traces and set the track and ns fields
sustrip—remove the SEGYheaders from the traces
supaste---paste existing现存的 SEGY headers on existing data
supswigp <junk.su title=”wiggle trace”> data7.eps &
运行以上程序之后,进入主目录,在所生成的.eps文件上点击右键,打开方式选择ggv,查看图像;
第三节常见处理
ADPCM 编码解码.详解

ADPCM 编码解码.详解技术知识2010-03-24 16:17:09 阅读126 评论0 字号:大中小订阅/blog/static/13030071920102244179620/Microsoft ADPCM 编码解码算法因为种种原因,最近需要把原始的wav文件压缩成ADPCM格式。
但是网上几乎搜不到相关的中文资料。
花了相当长的时间,七拼八凑的从一些文章中得到了些信息,终于搞定了它。
为了方便遇到跟我一样麻烦的人,我决定把它详细的写下来。
1. 关于DPCMDPCM是differential pulse code modulation的缩写,也就是差分脉冲编码调制的意思。
他的主要思想是通过已知的数据预测下一个数据,然后传递预测值与实际值之间的差值。
具体的细节可以在很多信号处理相关的书上找到。
一般的DPCM编码器都是采用的线性预测。
假设传递的数据是X1,X2,...Xn,而下一个数据,Xn+1还是未知。
可以通过前面的X1,X2,...Xn的加权和来预测Xn+1,也就是Xn+1 = ∑(Ai*Xi),其中i属于1...n为了简化计算,大部分编码的实现只取前两项,也就是,Xn+1 = a*Xn + b*Xn-1, 现在,最主要的事情就是如何对a,b进行取值,才能使得Xn+1的误差最小。
如果假设x~i 是预测值,xi是实际值,那么,∑(x~i-xi)^2 最小的时候,a,b就是最优的。
设F=∑(X~i-Xi)^2,因为X~i = a*X~i-1 + b*X~i-2,可以得出,F是关于a,b的二元函数.也就是F=f(a,b) 。
可以分别对a和b 求偏导数,求出它的极值点。
f<sub>a</sub>(a,b) = 0 ;f<sub>b</sub>(a,b) = 0 ;可以得到a * ∑(Xi-1)^2 +b * ∑(Xi-1)*(Xi-2) = ∑Xi*Xi-1a * ∑(Xi-1)*(Xi-2) +b * ∑(Xi-2)^2 = ∑Xi*Xi-2如果设alpha = ∑(Xi-1)^2beta = ∑(Xi-1)*(Xi-2)gama = ∑(Xi-2)^2m = ∑Xi*Xi-1n = ∑Xi*Xi-2上面的式子就可以写成a*alpha + b*beta = ma*beta + b*gama = n算出alpha,beta,gama,m,n以后,a和b的值就可以计算出来了,实际上我们只需要一个循环遍历前n个数就能把它们都求出来。
遥感ENVI实验报告

目录前言 (3)一、实验目的 (3)二、实验内容 (3)三、实验时间 (3)四、组织人员 (3)1.专题概述 (4)2. 处理流程介绍 (4)2.1图像获取 (4)2.2数据读取和定标 (4)2.3图像配准 (5)2.4大气校正 (5)2.5反演模型构建及模型应用 (5)2.6植被变化 (6)3.详细处理过程 (7)3.1数据预处理 (7)3.1.1安装环境小卫星数据处理补丁 (7)3.1.2数据处理和定标 (7)3.1.3工程区裁剪 (9)3.1.4图像配准 (14)3.1.5大气校正 (17)3.1.6裁剪浑善达克区 (23)3.2植被覆盖度反演 (27)3.2.1计算归一化植被指数 (27)3.2.2计算植被覆盖度 (28)3.3植被变化监测 (29)3.3.1植被覆盖区提取 (29)3.3.2植被变化检测 (31)3.4成果后期处理与应用 (32)3.4.1植被变化区域图的背景值处理 (32)3.4.2植被变化区域制图 (33)实验心得 (36)前言一、实验目的1、掌握ENVI软件的基本操作。
2、掌握卫星影像的预处理的基本流程。
3、通过实习,学会自己去处理一些问题。
4、进一步提高学生分析问题、解决问题的能力,增强实践技能,并培养学生勇于动手、勤于动手、热爱本专业的思想。
5、深刻地理解和巩固基本理论知识,掌握基本技能和动手操作能力,提高综合观察分析问题的能力二、实习内容1、了解ENVI的基本操作。
2、实现影像图像的几何校正、融合、镶嵌及剪裁。
3、掌握ENVI对影像信息的提取4、了解ENVI的一些应用分析专题:基于环境小卫星的草原荒漠化监测一、专题概述浑善达克地区位于内蒙古草原阴山北麓锡林郭勒高原中部,是亚洲草原荒漠化土地东部边缘区的重要组成部分,经纬度在东经114°55’~116°38’,北纬41°46’~43°07’之间,平均海拔高度在1100 米左右。
AQWA格式命令详解要点

AQWA文件系统介绍:AQWA的输入文件.dat 计算数据文件 (LBDNF).lin AGS 网格生成器所需的型线数据.msd BM/SF (AGS)所需的质量分布输入文件.sfm splitting forces (AGS) 所需的质量分布输入文件.wht 波高时间历史文件 (with IWHT in Deck 13 for BDNF).wvt 风速时间历史文件 (no card needed, for DN).xft 对一结构施加外力的时间历史文件 (no card needed, for DN).mor mooring 线描述文件(with FILE in Deck 14 for BDNF)OTHER INPUT/OUTPUT FILES (between stages).res 重启动文件 (binary, LBDNF).hyd 水动力文件 (binary, L).eqp 平衡位置文件(binary, B).uss source strength file (binary, with LDOP in Deck 0, L).pot potential file (binary, with LDOP in Deck 0, L)OUTPUT FILES.mes 输出message文件 (ASCII, LBDNF).lis output listing file (ASCII, LBDNF).pos output position file (binary, DN).plt output graphic file (binary, LBDNF).pac pressures at centroids (binary, L).vac velocities at centroids (binary, L)其中:1)AB***.eqp file:由 AQWA LIBRIUM生成;储存了结构的平衡位置信息;FDN可以读入作为起始位置(Deck 0要设置RDEP选项).2)A****.pos file:在时域分析中由DN生成;存储了每一时间步的结构的位置,速度数据3)Hydrodynamic (.hyd) File,二进制文件,由AQWA-LINE的散射/衍射分析生成包含了AQWA-LINE算得的水动力数据库.4)AL**.RES= AL**.DAT+AL**.HYD5)AGS Plot File (.plt),二进制文件,由主要分析过程 (Stage 5)生成,包含: 力和运动的时间历程 (DN);在向平衡位置迭代过程中的位置和力(B);forces and responses as a function of frequency (LF)6)Listing (.lis) File,包含刚执行完的STAGES分析的大多数输出文件 (以文本形式). AQWA输入文件解释Stages: 区分分析进行到哪个阶段,可以单独运行不同段也可以联合运行,stages之间有数据传递关系Stage 0 头文件设置 title restart 设置Stage 1 模型定义(节点,单元..), Decks 1 to 5Stage 2 水动力数据库定义 Decks 6 to 8Stage 3 绕射/散射分析* (L)Stage 4 主分析参数定义 Decks 9 to 20 (BDNF)Stage 5 主分析过程*Decks:卡片,区分输入数据Deck0 中 option cards可以有如下选项:PRCE PRint Card Echo for Decks 1 – 5 (LBDFN)DATA 检查输入文件 (equivalent to Stages 1-2, LBDFN)GOON 忽略不致命的错误和警告信息(L)REST 定义重启动STAGE (LBDFN)LDOP 输出表面压力计算所需的.POT和.uss文件(e.g pressure plots, SF/BM) (L)PPEL 输出每个单元的属性 (LBDFN)NPPP 设置节点不连续时,不用警告。
FFT最详细的源代码和解释

我自己的一些详细标注,有利于深入了解FFT,后面附加几位网友对FFT的理解及源代码,让广大朋友更迅速的掌握FFT#include "DSP281x_Device.h" // DSP281x Headerfile Include File,添加所有头文件#include "DSP281x_Examples.h" // DSP281x Examples Include File,条件编译而已#include "f2812a.h" //一些变量的宏定义而已#include"math.h"#define PI 3.1415926 //前变后常#define SAMPLENUMBER 128//#define SAMPLENUMBER 512void InitForFFT();void MakeWave();//void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]);int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];//逐级计算FFT,一级一级递推void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]){int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;/********** following code invert sequence ************///倒序for ( i=0;i<SAMPLENUMBER;i++ )//就是码位倒置嘛,二进制各个位独立出来再反向{ //128七位二进制表示,/号代表右移嘛x0=x1=x2=x3=x4=x5=x6=0;x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;//最低位,最高位反过来dataI[xx]=dataR[i];}for ( i=0;i<SAMPLENUMBER;i++ ){dataR[i]=dataI[i]; dataI[i]=0; //对应过来}/************** following code FFT *******************/for ( L=1;L<=7;L++ ){ /* for(1) */b=1; i=L-1;/* b的意义非常重大,b表示当前层不同旋转因子的个数*/while ( i>0 ){b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1; i=7-L;while ( i>0 ) /* p=pow(2,7-L)*j; */{p=p*2; i--;}p=p*j;for ( k=j;k<128;k=k+2*b ) /* for (3) */{TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p]; //递推嘛,防止立马调用结果,} /* END for (3) */ //引入一个中间变量存原始值,} /* END for (2) */ //防止上一步对下一步的影响} /* END for (1) */for ( i=0;i<SAMPLENUMBER/2;i++ ) //对称性,前半部分即可{w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);}} /* END FFT */main(){int i;InitForFFT();MakeWave();for ( i=0;i<SAMPLENUMBER;i++ ){fWaveR[i]=INPUT[i];fWaveI[i]=0.0f;w[i]=0.0f;}FFT(fWaveR,fWaveI);//输入波形进行FFT变换,此处引入起始实参即可递推下去for ( i=0;i<SAMPLENUMBER;i++ ){DATA[i]=w[i];//变换后的波形转换到输出接口}while ( 1 );// break point}//旋转因子事先初始化好,方便调用void InitForFFT(){int i;for ( i=0;i<SAMPLENUMBER;i++ ){sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);//旋转因子事先初始化好,方便调用}}//利用这个,确实能产生各种各样的谐波void MakeWave() //利用这个,确实能产生各种各样的谐波{int i;for ( i=0;i<SAMPLENUMBER;i++ )//1024是相应的幅值嘛,只要弄出个基波,以之为标准即可{INPUT[i]=sin(PI*2*i/SAMPLENUMBER)*1024+sin(PI*2*i/SAMPLENUMBER*3)*1024/3+sin(PI*2*i/SAMPLENUMBER*5)*1024/5+sin(PI*2*i/SAMPLENUMBER*7)*1024/7+sin(PI*2*i/SAMPLENUMBER*9)*1024/9;//INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024;}}X[0] = x[0]*(1-0) + x[1]*(1-0) = x[0] + 1*x[1]; X[1] = x[0]*(1-0) + x[1]*(-1-0) = x[0] - 1*x[1];这就是单个2点蝶形算法.FFT实现流程图分析(N=8, 以8点信号为例)FFT implementation of an 8-point DFT as two 4-point DFTs and four 2-pointDFTs8点FFT流程图(Layer表示层, gr表示当前层的颗粒)下面以LayerI为例.LayerI部分, 具有4个颗粒, 每个颗粒2个输入(注意2个输入的来源, 由时域信号友情提供, 感谢感谢☺)我们将输入x[k]分为两部分x_r[k], x_i[k]. 具有实部和虚部, 时域信号本没有虚部的, 因此可以让x_i[k]为0. 那么为什么还要画蛇添足分为实部和虚部呢? 这是因为LayerII, LayerIII的输入是复数, 为了编码统一而强行分的.当然你编码时可以判断当前层是否为1来决定是否分. 但是我想每个人最后都会倾向分的.旋转因子 tw = cos(2*PI*k/N)-j*sin(2*PI*k/N); 也可以分为实部和虚部, 令其为tw_r, tw_i;则tw = tw_r - j*tw_i;X[k] = (x_r[k] + j*x_i[k]) + (tw_r–j*tw_i) * (x_r[k+N/2]+j*x_i[k+N/2])则X_R[k] = x_r[k] + tw_r*x_r[k+N/2] + tw_i*x_i[k+N/2];X_I[k] = x_i[k] - tw_i*x_r[k+N/2] + tw_r*x_i[k+N/2];LayerII部分, 具有2个颗粒, 每个颗粒4个输入(注意4个输入的来源, 由LayerI友情提供, 感谢感谢☺)LayerIII部分, 具有1个颗粒, 每个颗粒8个输入(注意8个输入的来源, 由LayerII友情提供, 感谢感谢☺)LayerI, LayerII, LayerIII从左往右, 蝶形信号运算流非常明显!假令输入为x[k], x[k+N/2], 输出为X[k], X[k+N/2]. x[k]分解为x_r[k], x_i[k]部分则该蝶形运算为X[k]= (x_r[k]-j*x_i[k]) +(x_r[k+N/2]-j*x_i[k+N/2])*(cos(2*PI*k/N)-j*sin(2*PI*k/N));再令cos(2*PI*k/N)为tw1, sin(2*PI*k/N)为tw2 则X[k] = (x_r[k]-j*x_i[k]) + (x_r[k+N/2]-j*x_i[k+N/2])*(tw1-j*tw2);X_R[k] = x_r[k] + x_r[k+N/2]*tw1 - x_i[k+N/2]*tw2;X_I[K] = x_i[k]x_r[k] = x_r[k] + x_r[k+b]*tw1 + x_i[k+b]*tw2;x_i[k] = x_i[k] - x_r[k+b]*tw2 + x_i[k+b]*tw1;譬如8点输入x[8]1. 先分割成2部分: x[0], x[2], x[4], x[6] 和 x[1], x[3], x[5], x[7]2. 信号x[0], x[2], x[4], x[6]再分割成x[0], x[4] 和 x[2], x[6]信号x[1], x[3], x[5], x[7]再分割成x[1], x[5] 和 x[3], x[7]3. 无法分割了, 已经分割成2点了☺.如上图:在LayerI的时候, 我们是对2点进行DFT.( 一共4次DFT )输入为 x[0]&x[4]; x[2]&x[6]; x[1]&x[5]; x[3]&x[7]输出为 y[0],y[1]; Y[2],y[3]; Y[4],y[5]; Y[6],y[7];流程:I. 希望将输入直接转换为x[0], x[4], x[2], x[6], x[1], x[5], x[3], x[7]的顺序II. 对转换顺序后的信号进行4次DFT步骤I代码实现/*** 反转算法.这个算法效率比较低!先用起来在说, 之后需要进行优化.*/static void bitrev( void ){int p=1, q, i;int bit_rev[ N ];float xx_r[ N ];bit_rev[ 0 ] = 0;while( p < N ){for(q=0; q<p; q++){bit_rev[ q ] = bit_rev[ q ] * 2;bit_rev[ q + p ] = bit_rev[ q ] + 1;}p *= 2;}for(i=0; i<N; i++) xx_r[ i ] = x_r[ i ];for(i=0; i<N; i++) x_r[i] = xx_r[ bit_rev[i] ];}// ------------------------ 此刻序列x重排完毕------------------------步骤II代码实现int j;float TR; // 临时变量float tw1; // 旋转因子/* 两点DFT */for(k=0; k<N; k+=2){// 两点DFT简化告诉我们tw1=1TR = x_r[k]; // TR就是A, x_r[k+b]就是B.x_r[k] = TR + tw1*x_r[k+b];x_r[k+b] = TR - tw1*x_r[k+b];}在LayerII的时候, 我们希望得到z, 就需要对y进行DFT.y[0],y[2]; y[1],y[3]; y[4],y[6]; y[5],y[7];z[0], z[1]; z[2],z[3]; z[4],z[5]; z[6],z[7];在LayerIII的时候, 我们希望得到v, 就需要对z进行DFT.z[0],z[4]; z[1],z[5]; z[2],z[6]; z[3],z[7];v[0],v[1]; v[2],v[3]; v[4],v[5]; v[6],v[7];准备令输入为x[s], x[s+N/2], 输出为y[s], y[s+N/2]这个N绝对不是上面的8, 这个N是当前颗粒的输入样本总量对于LayerI而言N是2; 对于LayerII而言N是4; 对于LayerIII而言N是8复数乘法:(a+j*b) * (c+j*d)实部 = a*c – bd;虚部 = ad + bc;旋转因子:实现(C描述)#include <stdio.h>#include <math.h>#include <stdlib.h>//#include "complex.h"//--------------------------------------------------------------------------#define N 8 //64#define M 3 //6 //2^m=N#define PI 3.1415926//--------------------------------------------------------------------------float twiddle[N/2] = {1.0, 0.707, 0.0, -0.707};float x_r[N] = {1, 1, 1, 1, 0, 0, 0, 0};float x_i[N]; //N=8/*float twiddle[N/2] = {1, 0.9951, 0.9808, 0.9570, 0.9239, 0.8820, 0.8317, 0.7733,0.7075,0.6349, 0.5561, 0.4721, 0.3835, 0.2912, 0.1961, 0.0991 ,0.0000,-0.0991,-0.1961,-0.2912,-0.3835,-0.472 1,-0.5561,-0.6349,-0.7075,-0.7733,0.8317,-0.8820,-0.9239,-0.9570,-0.9808,-0.9951}; //N=64float x_r[N]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};float x_i[N];*/FILE *fp;// ----------------------------------- func-----------------------------------/*** 初始化输出虚部*/static void fft_init( void ){int i;for(i=0; i<N; i++) x_i[i] = 0.0;}/*** 反转算法.将时域信号重新排序.* 这个算法有改进的空间*/static void bitrev( void ){int p=1, q, i;int bit_rev[ N ]; //float xx_r[ N ]; //bit_rev[ 0 ] = 0;while( p < N ){for(q=0; q<p; q++){bit_rev[ q ] = bit_rev[ q ] * 2;bit_rev[ q + p ] = bit_rev[ q ] + 1;}p *= 2;}for(i=0; i<N; i++) xx_r[ i ] = x_r[ i ];for(i=0; i<N; i++) x_r[i] = xx_r[ bit_rev[i] ]; }/* ------------ add by sshc625 ------------ */static void bitrev2( void ){return ;}/* */void display( void ){printf("/n/n");int i;for(i=0; i<N; i++)printf("%f/t%f/n", x_r[i], x_i[i]);}/****/void fft1( void ){ fp = fopen("log1.txt", "a+");int L, i, b, j, p, k, tx1, tx2;float TR, TI, temp; // 临时变量float tw1, tw2;/* 深M. 对层进行循环. L为当前层, 总层数为M. */for(L=1; L<=M; L++){fprintf(fp,"----------Layer=%d----------/n", L);/* b的意义非常重大,b表示当前层的颗粒具有的输入样本点数 */b = 1;i = L - 1;while(i > 0){b *= 2;i--;}// -------------- 是否外层对颗粒循环, 内层对样本点循环逻辑性更强一些呢! --------------/** outter对参与DFT的样本点进行循环* L=1, 循环了1次(4个颗粒, 每个颗粒2个样本点)* L=2, 循环了2次(2个颗粒, 每个颗粒4个样本点)* L=3, 循环了4次(1个颗粒, 每个颗粒8个样本点)*/for(j=0; j<b; j++){/* 求旋转因子tw1 */p = 1;i = M - L; // M是为总层数, L为当前层.while(i > 0){p = p*2;i--;}p = p * j;tx1 = p % N;tx2 = tx1 + 3*N/4;tx2 = tx2 % N;// tw1是cos部分, 实部; tw2是sin部分, 虚数部分.tw1 = ( tx1>=N/2)? -twiddle[tx1-N/2] : twiddle[ tx1 ]; tw2 = ( tx2>=N/2)? -twiddle[tx2-(N/2)] : twiddle[tx2];/** inner对颗粒进行循环* L=1, 循环了4次(4个颗粒, 每个颗粒2个输入)* L=2, 循环了2次(2个颗粒, 每个颗粒4个输入)* L=3, 循环了1次(1个颗粒, 每个颗粒8个输入)*/for(k=j; k<N; k=k+2*b){TR = x_r[k]; // TR就是A, x_r[k+b]就是B.TI = x_i[k];temp = x_r[k+b];/** 如果复习一下 (a+j*b)(c+j*d)两个复数相乘后的实部虚部分别是什么* 就能理解为什么会如下运算了, 只有在L=1时候输入才是实数, 之后层的* 输入都是复数, 为了让所有的层的输入都是复数, 我们只好让L=1时候的* 输入虚部为0* x_i[k+b]*tw2是两个虚数相乘*/fprintf(fp, "tw1=%f, tw2=%f/n", tw1, tw2);x_r[k] = TR + x_r[k+b]*tw1 + x_i[k+b]*tw2;x_i[k] = TI - x_r[k+b]*tw2 + x_i[k+b]*tw1;x_r[k+b] = TR - x_r[k+b]*tw1 - x_i[k+b]*tw2;x_i[k+b] = TI + temp*tw2 - x_i[k+b]*tw1;fprintf(fp, "k=%d, x_r[k]=%f, x_i[k]=%f/n", k, x_r[k],x_i[k]);fprintf(fp, "k=%d, x_r[k]=%f, x_i[k]=%f/n", k+b, x_r[k+b], x_i[k+b]);} //} //} //}/*** ------------ add by sshc625 ------------* 该实现的流程为* for( Layer )* for( Granule )* for( Sample )*****/void fft2( void ){ fp = fopen("log2.txt", "a+");int cur_layer, gr_num, i, k, p;float tmp_real, tmp_imag, temp; // 临时变量, 记录实部float tw1, tw2;// 旋转因子,tw1为旋转因子的实部cos部分, tw2为旋转因子的虚部sin部分.int step; // 步进int sample_num; // 颗粒的样本总数(各层不同, 因为各层颗粒的输入不同)/* 对层循环 */for(cur_layer=1; cur_layer<=M; cur_layer++){/* 求当前层拥有多少个颗粒(gr_num) */gr_num = 1;i = M - cur_layer;while(i > 0){i--;gr_num *= 2;}/* 每个颗粒的输入样本数N' */sample_num = (int)pow(2, cur_layer);/* 步进. 步进是N'/2 */step = sample_num/2;/* */k = 0;/* 对颗粒进行循环 */for(i=0; i<gr_num; i++){/** 对样本点进行循环, 注意上限和步进*/for(p=0; p<sample_num/2; p++){// 旋转因子, 需要优化...tw1 = cos(2*PI*p/pow(2, cur_layer)); tw2 = -sin(2*PI*p/pow(2, cur_layer));tmp_real = x_r[k+p];tmp_imag = x_i[k+p];temp = x_r[k+p+step];/*(tw1+jtw2)(x_r[k]+jx_i[k])** real : tw1*x_r[k] - tw2*x_i[k]* imag : tw1*x_i[k] + tw2*x_r[k]* 我想不抽象出一个* typedef struct {* double real; // 实部* double imag; // 虚部* } complex; 以及针对complex的操作* 来简化复数运算是否是因为效率上的考虑!*//* 蝶形算法 */x_r[k+p] = tmp_real + ( tw1*x_r[k+p+step] -tw2*x_i[k+p+step] );x_i[k+p] = tmp_imag + ( tw2*x_r[k+p+step] +tw1*x_i[k+p+step] );/* X[k] = A(k)+WB(k)* X[k+N/2] = A(k)-WB(k) 的性质可以优化这里*/// 旋转因子, 需要优化...tw1 = cos(2*PI*(p+step)/pow(2, cur_layer));tw2 = -sin(2*PI*(p+step)/pow(2, cur_layer));x_r[k+p+step] = tmp_real + ( tw1*temp -tw2*x_i[k+p+step] );x_i[k+p+step] = tmp_imag + ( tw2*temp +tw1*x_i[k+p+step] );printf("k=%d, x_r[k]=%f, x_i[k]=%f/n", k+p, x_r[k+p], x_i[k+p]);printf("k=%d, x_r[k]=%f, x_i[k]=%f/n", k+p+step,x_r[k+p+step], x_i[k+p+step]);}/* 开跳!:) */k += 2*step;}}}/** 后记:* 究竟是颗粒在外层循环还是样本输入在外层, 好象也差不多, 复杂度完全一样.* 但以我资质愚钝花费了不少时间才弄明白这数十行代码.* 从中我发现一个于我非常有帮助的教训, 很久以前我写过一部分算法, 其中绝大多数都是递归.* 将数据量减少, 减少再减少, 用归纳的方式来找出数据量加大代码的规律* 比如FFT* 1. 先写死LayerI的代码; 然后再把LayerI的输出作为LayerII的输入, 又写死代码; ......* 大约3层就可以统计出规律来. 这和递归也是一样, 先写死一两层, 自然就出来了! * 2. 有的功能可以写伪代码, 不急于求出结果, 降低复杂性, 把逻辑结果定出来后再添加. * 比如旋转因子就可以写死, 就写1.0. 流程出来后再写旋转因子.* 寥寥数语, 我可真是流了不少汗! Happy!*/void dft( void ){int i, n, k, tx1, tx2;float tw1,tw2;float xx_r[N],xx_i[N];/** clear any data in Real and Imaginary result arrays prior to DFT */for(k=0; k<=N-1; k++)xx_r[k] = xx_i[k] = x_i[k] = 0.0;// caculate the DFTfor(k=0; k<=(N-1); k++){for(n=0; n<=(N-1); n++){tx1 = (n*k);tx2 = tx1+(3*N)/4;tx1 = tx1%(N);tx2 = tx2%(N);if(tx1 >= (N/2))tw1 = -twiddle[tx1-(N/2)];elsetw1 = twiddle[tx1];if(tx2 >= (N/2))tw2 = -twiddle[tx2-(N/2)];elsetw2 = twiddle[tx2];xx_r[k] = xx_r[k]+x_r[n]*tw1;xx_i[k] = xx_i[k]+x_r[n]*tw2;}xx_i[k] = -xx_i[k];}// displayfor(i=0; i<N; i++)printf("%f/t%f/n", xx_r[i], xx_i[i]);}//---------------------------------------------------------------------------int main( void ){fft_init( );bitrev( );// bitrev2( );//fft1( );fft2( );display( );system( "pause" );// dft();return 1;}#include <iom128.h>#include <intrinsics.h>/*********************************************************************快速福利叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。
mfc背景音乐与图片的实现
MFC播放声音文件一.播放声音文件的简单方法在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。
利用这些函数可以方便地播放声音。
最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。
例如播放C:\sound\music.wav可以用sndPlaySound ( "c:\\sound\\music.wav ",SND_ASYNC);或PlaySound( "c:\\sound\\music.wav ",NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。
二.将声音文件加入到程序中在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。
同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE 文件,实现无.WAV文件的声音播放。
要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。
假设生成的声音文件资源标识符为IDR_WAVE1。
在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_ RESOURCE|SND_NODEFAULT|SND_LOOP);其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,SND_RESOURCE是必须的标志。
遥感应用实验 实验一 大气校正
4.4 多光谱大气校正
• 3 Flaash大气校正方法 • (1)存储调整 Basic Tools – Convert Data • 得到符合Flaash要求的辐射亮度值
4.4 多光谱大气校正
• (2)辐射率转换因子
Radiance Scale Factors是一个单位转换因子,radiance(光谱灵敏 度)是标准单位w/m2 *um *rad ,而flaash要求输入的是 uw/cm2*sr*nm,则该因子为10。 1m=103mm=106μm=109nm=1012pm(皮米) 1w=103mw=106μw 1兆瓦=106瓦 Rad平面角弧度 sr 立体角球面度
QUAC快速大气校正
• QUAC的输入数据可以是辐射亮度值、表 观反射率、无单位的raw数据。可以是任何 数据储存顺序(BIL/BIP/BSQ)和储存类 型,多光谱和高光谱传感器数据的每个波 段必须有中心波长信息。
操作过程
• (1)在ENVI主菜单中,选择以下方式启动 lBasic Tools-> Preprocessing-> Calibration Utilities-> QUick Atmospheric Correction lSpectral-> QUick Atmospheric Correction lSpectral-> Preprocessing-> Calibration Utilities-> QUick Atmospheric Correction 在文件输入对话框中选择校正的图像文件。 (2)打开QUick Atmospheric Correction Parameters 面板在Sensor Type中选择相应的传感器类型,选择文件 名和路径输出。
QAC代码检查方案
QA C/C++/Java分别是针对三种源代码语言的代码规则检查和静态分析工具,用于鉴别C/C++/Java语言使用过程中出现的问题,这些问题包括语言中比较危险、过于复杂、不可移植、难于维护的特性,或者是编码不符合特定的规则。
而这些问题是不能靠编译器或开发工具识别的。
QA C/C++/Java能明显地减少代码审查所需的时间,使程序员对他们未完全理解的C/C++/Java语言编程特点多加注意。
通过在开发的最初阶段就注意避免编码问题,可以提高代码的质量,测试的周期也将会缩短。
图 1 QA C工程功能特点(QA C/C++)QA C●分析C代码,提供超过1300种C语言使用中容易出现的潜在问题,从而发现危险的结构,发现维护和移植中发生的问题。
●成功解析许多流行的C语言编译器中的语言扩展和非标准的结构。
●轻松定制警告信息和报告。
●提供44种工业认可的复杂度度量,包括圈复杂度、静态路径统计和Myer’s interval等,还可以扩展公司特定的复杂度度量。
●报告ISO 标准中的非标准C●可扩展,执行特定的分析检查。
●提供多种多样的可视化输出,包括函数结构图、函数调用树、外部参考、文件包含关系和统计的度量分析。
●高亮显示C和C++语言的移植问题。
●在线的HTML帮助提供警告信息的详细解释,帮助开发人员加深理解语言特性。
●可用于Windows和Unix平台,有方便易用的GUI图形界面。
可以和流行的开发环境集成QA C++●分析标准的C++,可报告400多种C++设计中的潜在问题,如代码构造行为,低效的执行,C++相对于C的优先选择机制,可维护和可移植性的考虑以及标准库使用的建议。
●解析在大多数流行编译器中见到的非标准C++构造,。
●配置警告信息、报告和缺省值●产生针对函数、类和文件的通用的语言度量,包括圈复杂度、静态路径计算、嵌套的深度和基于类的度量。
●产生基于ISO标准C++或是用户根据需求自定义的报告●多种可视化输出,包括函数调用、类继承、文件包含关系和统计度量分析。
音乐和视频应用实例
多媒体应用设计媒体控制接口(Media Control Interface,MCI)向基于Windows操作系统的应用程序提供了控制媒体设备的接口。
应用程序通过MCI发送相应的命令控制媒体设备。
奉章将主要使用该技术开发简单的音频视频程序,以及使用Shockwave Flash Object控件制作Flash播放程序。
一、音频和视频播放基础本部分将介绍如何使用VC 6.0++开发简单的音视频以及Flash播放程序。
具体内容包含WA V、MP3、A VI等一些常见的音视频文件的播放程序开发过程。
例1 使用PlaySound()播放W A V文件【关键技术解析】1.BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) 。
2.pszSound可以为W A V文件、W A V资源的名字或者播放内存中的声音。
3.参数hmod是应用程序的实例句柄,除非pszSound的是一个资源标识符而且fdwSound被定义为SND_RESOURC,否则必须设置为NULL。
4.参数fdwSound是标志的组合,常用的标志有:标志SND_ASYNC用异步方式播放声音,标志SND FILENAME指明pszSound代表的是文件名,标志SND RESOURCE指明pszSound代表W A VE资源。
fdwSound是标志的组合,如下表所示。
若成功则函数返回TRUE,否则返回FALSE。
标志含义SND_APPLICATION 用应用程序指定的关联来播放声音。
SND_ALIAS pszSound参数指定了注册表或WIN.INI中的系统事件的别名。
SND_ALIAS_ID pszSound参数指定了预定义的声音标识符。
SND_ASYNC 用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME pszSound参数指定了WAVE文件名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct {
char riff[4]; // RIFF file identification (4 bytes)
0-3:RIFF
long length; // length field (4 bytes)
4-7::0000b4c4(16进制)->46276(10进制):约等于45kb,此文件大小45.1kb
char wave[4]; // WAVE chunk identification (4 bytes)
8-b:wave
}WAVECHUNK;
typedef struct{
char fmt[4]; // format sub-chunk identification (4 bytes)
b-f:fmt :注意,fmt后有空格
long flength; // length of format sub-chunk (4 byte integer)
10-13:未知含义
short format; // format specifier (2 byte integer) [wFormatTag]
14-15
short chans; // number of channels (2 byte integer) [nChannels]
16-17:声道数。
0001:1个声道
long sampsRate; // sample rate in Hz (4 byte integer) [nSamplesPerSec]
18-1b:1F40(16进制)-》8000(十进制):采样率
long bpsec; // bytes per second (4 byte integer) [nAvgBytesPerSec]
1c-1f:3e80(16进制)-》16000(十进制):一秒8000采样,一个采样16bit=2byte:8000*2 short bpsample; // bytes per sample (2 byte integer) [nBlockAlign]
20-21:0002(16进制)-》2(十进制):一个采样点用2byte表示,就量化级为16bit short bpchan; // bits per channel (2 byte integer) [wBitsPerSample]
22-23: 0010(16进制)-》16(十进制):一个信道:量化级为16bit
}FMTCHUNK;
typedef struct{
char szFactID[4]; //'f','a','c','t'
long dwFactSize; //the value is 4
}FACTCHUNK;
typedef struct{
char data[4]; // data sub-chunk identification (4 bytes)
24-27:data
long dlength; // length of data sub-chunk (4 byte integer)
28-2b::0000b4a0(16进制)->46240(10进制):总文件长度-44byte。
}DATACHUNK;。