|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
$ @ x. N8 K% ]% @' c3 ?
( F6 A2 {. L) }2 G A/ Y& j/ j各位大神:
: q/ x6 M( S% I' M/ d: ?5 v% @( h 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
/ k+ ~% u: `+ P/ Z3 G) ~" p9 ?* R8 s! w/ N 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:% ?1 Y6 T) J2 `. x
+ U, c/ U9 k/ P2 I/ } , X" b0 e0 u0 ^1 m
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。1 r* g5 D6 Q X0 D+ }% B; S6 ?; [
& y' `& L5 m+ p; `并没有其他线程6 k+ [% W5 g! g z$ d9 U+ H
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
5 `/ a- Q7 p' B' O也说不定是和堆栈有关系。。。。。。3 b0 \+ M" ~6 Z3 x- U
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; v( ^$ }1 K# ?& k& Z+ i4 R, \ T1 M7 }9 ^4 F, I& E; Z F, z
! x! F; J3 o" x1 |" O0 d) H' ^0 x+ l/ x% `% F
我也很绝望啊,希望大神能帮帮忙,感激不尽,!! h0 S- w6 R* [! q7 K
0 p* l! f T$ W/ b
! O( c% _" N" K: t, e& a0 i/ l附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
2 e+ s- K) }+ J( D& G/ p4 O7 [ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。( D* v! f- A( Q9 \& G" D* t
- V2 G' z% K) S% v$ h
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(- }. K6 Y; k4 t6 u# _
const double data1000[1000]) {
6 j) D" ]7 M, [
0 Q9 @: O# C, X1 A: i' A" P1 s int myfuck;- S! d! y5 I& I7 j
double yiDuanShuJu_mean;
S7 s3 s) T5 K% i double yiDuanShuJu_LowMean[1000]; ^& T j8 b, e" T" o
int ixstart;
$ m+ F' `# f1 B6 g' z7 S double dv0[1000];+ s3 b' n0 ^9 W5 r
comm_AGC pAGC;, b6 R% T9 `8 }6 ]$ ^& i- M
comm_CarrierSynchronizer pFineFreqCompensator;. b" {$ m3 C* C. C; e! M
dspcodegen_FIRDecimator pRxFilter;+ l, \" P j; w1 {6 ]
comm_SymbolSynchronizer pTimingRec; r7 e2 d4 J9 `8 \ t
comm_PreambleDetector pPrbDet;
, S( c. _& ~# R! Z. S* b+ i5 ?; D! D FrameSynchronizer pFrameSync;
" e. T: f! q0 `5 F& b+ a QPSKDataDecoder pDataDecod;6 d( U4 F* W3 _+ ]9 v# p( _) h
static double usable_left_filtfilt[81000];7 @+ W. y. ^# s3 ]/ m, [( n
static double youXiaoShuJu_QuZhiLiu[81000];1 m; i/ d6 o" Y3 Y$ T+ j3 I) Z
double mtmp;
2 w p; S) v! t- m9 a) s1 ]8 e int ix;
7 @( R& l8 `4 m boolean_T exitg2;4 j( W: Y. d% A
boolean_T exitg1;
! `- f! F( Y( N# y double YiZhenShuJu[800];
1 j: @$ ]/ R. s( s6 E5 ?, E1 |, ` t0 { double dv1[800];
, c6 f9 Q" D5 t9 c+ G4 x( J+ |* f* d% X- ]; j5 C
' m7 X) p8 P7 b1 R6 W B double b_YiZhenShuJu[800];
V- y/ {6 q, P3 @: Y3 n double I_filtfilt[800];
* U4 ]% e7 [( v4 i double Q_filtfilt[800];* |% R% i6 e7 A2 J
creal_T b_I_filtfilt[800];! Y. m, f' y8 v* w6 I1 R6 a+ D
creal_T b[800];, T; v: W1 K; \. \; i
creal_T RCRxSignal[50];
9 K# S' O, H9 l. b3 o5 x' S" R: K creal_T fineCompSignal[50];! R# z# N7 k s! h3 x- }
double phError[50];/ Q$ W# S N x9 Q
creal_T timingRecSignal_data[28];
7 l4 Q- N) y- J7 ~/ o7 v int timingRecSignal_size[1];( m$ S' I6 S' O A
double prbIdx_data[28];( K/ @/ [* A! C# T: Y+ U
int prbIdx_size[1];
( D2 H7 o; a5 Z c9 t( h double dtMt_data[28];
3 M T. u- i+ B3 p q y int dtMt_size[1];% y1 E" V1 F: u* W/ f
creal_T symFrame[25];
& ]# |+ ?) U* h Q7 S boolean_T isFrameValid;3 D! C% X( P6 q8 ]) z
double unusedU0[3];
/ K+ O: }* x: Z2 ^7 i
3 D. g3 X8 ?" z( C$ Z+ ~2 A //调试过程中的变量6 N Q' w6 t2 v7 w) I
int enough_data;$ J- [/ a. p0 D$ V( I. U
1 G) O0 r2 Z2 k! g1 f0 i0 C
int enoughDataFlag;! j+ E& l$ P0 k3 f( }9 {
int yiDuanShuJu_mean_int;& V# J a/ |+ T- A& o: z
int int_sum_dv0;( |6 e( }: J' e! m. O
int oo;
" _ g$ \" K& a/ m% w3 m- B int ii;* q/ P* r2 F, d/ Y& w' P$ d$ j8 F
myfuck=10;
, n+ u, {6 r6 w$ }: G /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */; n7 |- u/ `/ S% g, n
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
: ?7 @( `. H3 h; i4 P5 z
8 N- _! z( k# ~8 Y2 K ` yiDuanShuJu_mean = mean(data1000);! n @( C: i1 }2 F7 n: Z' J
3 r! S0 `; X) m/ C' O* y4 `3 z9 ?1 S yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
1 F) o! [' T1 s; Z U UARTPutc('A'); u" w" _& Q1 [5 f$ W
UARTPutNum(yiDuanShuJu_mean_int);
# X$ | N q4 {- r UARTPutc('\r');
+ g4 D) a! z6 k UARTPutc('\n');
3 {- F$ I) t8 y; \
3 Q: W/ ^3 C7 {; P9 L. v for (ixstart = 0; ixstart < 1000; ixstart++) {, d8 [4 Y' F; b$ D, b9 M8 b, i# |
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
4 F2 _; r, ]% w L5 v# _ \ }
- g1 j( q: t. `( \" u% ]" w, P' z! P9 u
power(yiDuanShuJu_LowMean, dv0);
5 T; ~* s/ a, D+ z8 E0 a5 H0 S0 U6 P9 ^& G7 T
int_sum_dv0 = (int) sum(dv0);) W5 L5 r$ p' X/ z' `( d/ V
' G- {5 n @' F; d( \' Q4 c" i! {6 d
UARTPutc('B');
0 u/ r$ K* f0 I( x UARTPutNum(int_sum_dv0);
# `/ s! z/ O' Q) X2 k UARTPutc('\r');* R5 Y4 _) c3 Y. x; m8 e0 s! B
UARTPutc('\n');
& F+ G7 ^+ x9 H2 a& D
9 y* k4 D4 f3 b" P+ i$ V, O// int compareFlag = int_sum_dv0 > 1.0E+8;
9 h1 o' D% i) H0 o! N% w' {# \/ u, J- f, b% A6 s% [) E4 q8 _$ d, J
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?, T F7 n# y8 O
UARTPutc('C');; E% ~) h( Y$ e: o6 `; j
/* 比较信号能量 */6 ?6 m1 y* p3 U/ T4 h
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */# o2 t1 s. o8 W( _. [
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
. O) B' ^2 x2 s' [// for (ixstart = 0; ixstart < 1000; ixstart++) {
( M2 f, i. b: J m \// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
, w# ~6 E g/ Q, U! M# N// yiDuanShuJu_LowMean[ixstart];6 y* u1 r" U a) v9 M" i
// }
( I) c* V0 ], n/ p' B( C# v; x# r//
! x8 ^0 B; x, c/ d6 @// youxiao_k++;
. n8 m; @" q0 ?1 y+ v( R5 f// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==3 F+ \. q# X( j- p6 Z
// /* 感觉要取21个数,即0-20, */; A& }5 T6 \5 M+ {# Q6 @9 I
// enough_data = 10;//有效是10,无效是0
) @( F3 P! j% r9 v: m+ ?, J// }% x7 e/ ]% ~5 l9 i' U# @% D
}
, R; j2 T4 W4 F, R X' Q
* Y: G, a/ X9 c$ h( U
; E, ?( w' A) N% p) W4 v enoughDataFlag = 100;5 p2 L1 Y, }/ J* M
enoughDataFlag = 1000;
7 h0 r# U' Q$ H; ^ enoughDataFlag = 0x02;
6 ^$ ]3 ^ m( ~- p( s enoughDataFlag = 200;
8 Y! H; w4 L4 P z @- K1 s& n6 V" H/ g; p F) q* ^( C; J
int myfuvk1;
) a3 H" x2 n7 }9 a" {: Z) n; b myfuvk1 =11;
! S; w( l3 u) A3 q, k5 K% N0 I; [2 N8 |5 ?% _3 J1 {# v$ A
% l- G2 D' M5 X* G3 F! R
enough_data = 0; v% D0 z5 c1 k$ g2 ^ e2 i
Q* |& \4 X: a0 f, i2 Z/ Z// if(enough_data>50){
! w* P5 S3 O1 ?5 B5 k* ~- ^( _// enoughDataFlag=0x01;
7 V/ W* g# Q7 ]& v// }else if(enough_data<50){
3 n7 A; O3 y0 H) Y// enoughDataFlag=0x00;//0x00还是不行! l; o$ u8 p$ x- q0 D0 V
// }
' B2 _) i6 a$ v& l$ Z
9 J$ f# b( z% w. b
& a# |9 c" }' o# ?4 h) C( j0 c, X oo=10;$ Z; ~4 C8 F5 p& G. j/ L+ |
oo = oo < 5;% W0 j2 Y8 D3 e b
if(oo){# i, w% V B5 K X% z
ii=0;4 }, L! l: o" q( a9 p* ^$ S
}
% `) i/ |0 M8 d N8 ~& `. X' `& t if(oo < 5){
& u, Y2 F. ~; T' o8 ?$ x9 ~* x; v ii=0;
, w2 \) M) w2 ]: X4 ]$ s1 ?* n }
3 U( }& O F8 J$ Y, O, G) V if(oo > 5){5 z: K5 R+ W% n
ii=0;
3 `: X, Y; X5 { }
* x! [+ o5 I3 w1 T1 h
6 b; H. p9 T: E/ j0 {2 Z /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */8 U0 Z3 j* l6 }6 ?0 s
/* 如果数据足够才执行主程序 */8 {- ^0 L$ u8 b$ g9 n# C! r( H
oo = oo < 5;
4 n5 ?! M* R6 x7 j2 i enoughDataFlag = enoughDataFlag < 5;
7 S+ h5 A) ^' T if (enoughDataFlag < 5) {
1 y- b A! _# j% S// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
4 T: P+ t" N0 ^ AGC_AGC(&pAGC);
0 s5 |( x- m7 N: j
) y* z, N" g* ? H* L3 ^' V1 } c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
/ ^# Y3 Z# b. Y6 ]: d7 C" f& w FIRDecimator_FIRDecimator(&pRxFilter);
( [6 f5 j7 b6 [
. {3 S+ G4 v! y) e) m3 r `* i! f /* Downsampling */7 v2 x9 j% H( C* }/ l. D4 {
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
! f1 ^2 W% C5 R5 Q' q6 V- V5 q! d, m R4 W) ~- Y
c_PreambleDetector_PreambleDete(&pPrbDet);5 ]: f( X7 b$ o7 B( F
5 u9 S9 w" }6 H% s8 \) i
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
4 v* z9 n: B! j& T' M0 Z( Z% `# T) A0 e /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
/ b' ^2 y9 z, u6 t9 ]1 Y# P /* %帧数量=100 */$ D* x+ W1 n% W
pFrameSync.isInitialized = 0;* f& i1 J! S9 u6 z# P0 s# {
5 l8 h" b: _' F. T& A
/* [EOF] */
u( H& J" B* _6 i* D /* 前导码长度是13 */
; L, |, P& }8 I e3 O9 p /* %qpsk */
6 {- ?8 q9 k/ f4 S o, `8 d pDataDecod.isInitialized = 0;
9 j1 }- I/ W! d" }( f: Y
! a8 A: H: P) Q5 H5 \: W /* end */! K2 i" R) C2 |9 d% `: ~% B
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */' y9 W+ ~6 T6 u& e! h
/* Convert 3-dB frequency */. r# S5 K5 ~% Y3 y$ y
/* Convert 3-dB frequency */
% a+ H; M$ v8 n! P5 e8 a# q filtfilt(save_buffer, usable_left_filtfilt);
7 X# M& I+ K- }. } for (ixstart = 0; ixstart < 81000; ixstart++) {! K7 F) o- R1 {7 u
usable_left_filtfilt[ixstart] *= 2.0;+ s1 `9 g' C6 r3 N# r
}1 S9 o9 j6 o0 S( B7 g2 H
! z3 z v9 Q5 J7 f, e6 l4 U /* 注意乘2,处理幅度 */8 z4 _" n4 x: d' C
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
) H! C. o! g* T /* %% 行列转换 */
/ A# B/ ~( k* n* S7 f4 A6 i) ^ yiDuanShuJu_mean = b_mean(usable_left_filtfilt);# C3 U% e8 i8 L' s
for (ixstart = 0; ixstart < 81000; ixstart++) {5 p9 B& N) z) Z5 Y, ?. {
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]5 d* Z; }2 o; q0 H. W% v9 \( J
- yiDuanShuJu_mean;
3 ]; {- U p: k& H" \ }
6 R& z; H$ U* R2 i p, |4 B E/ p
' n# E' O3 L( J; p3 S I /* %% 应该对数据归一化,但是这一步放在哪比较好 */0 K8 d1 p6 W( k2 H, ~" j- g
ixstart = 1;
; N+ e7 a5 X* o mtmp = youXiaoShuJu_QuZhiLiu[0];3 ~8 W; v% Q+ C* g
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
2 W+ z3 e0 |. e1 `# K3 m' ?; n, X ix = 2;
+ X4 @$ R6 p% a6 ]' S/ K5 R8 F exitg2 = false;
; a/ i- Y( `- m1 W$ J) u5 A while ((!exitg2) && (ix < 81001)) {" q+ Q8 `+ _0 _& O. a
ixstart = ix;
; Q: T9 v. T' w8 z: G. Z/ d' t% W if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 r4 Z3 p- C! X8 Z
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' y( [! F% t E4 v exitg2 = true;/ I: F1 m2 d+ L8 K* ]: M
} else {
4 L$ ~5 w3 p! L" a ix++;- k/ b2 _. k1 r ^
}
1 w# y R6 [2 B; t' S! e }
k, P- I! R2 U4 W7 ` }
" n3 C1 U1 s/ {: G7 J4 G% I& o, g$ ?, l2 p' r
if (ixstart < 81000) {
0 W' R7 ^1 ]0 W8 q. E: l while (ixstart + 1 < 81001) {3 u+ K5 W+ Q* x9 B$ b
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( h* U% h7 U, W% x1 e mtmp = youXiaoShuJu_QuZhiLiu[ixstart];1 o6 d- n# U; K: t& G0 Z
}
( {5 ]3 f* G$ R* e, X7 R* q$ {6 F3 q4 H5 u' H0 ~
ixstart++;: g1 d) B( J) L- G: w H4 h: e
}
* x/ `, N" b) P3 A; B x' O }
# d+ _) |; W* `& L: ]' l
$ k- X; Z4 w4 ?6 ` ixstart = 1;) Q2 v, B/ t. g. v
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0]; @2 V0 }+ g. | |6 m
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
- `$ z# d0 Y" X. a* { ix = 2;5 [9 g u( c9 Z$ T: | v
exitg1 = false;* R! r" O5 q( ^
while ((!exitg1) && (ix < 81001)) {( z, m3 L0 S( `$ N
ixstart = ix;
( C' B/ {" t2 H% V W if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. g6 `5 q# @+ l
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];* Y0 j9 r2 ~8 }- p- A ]% P
exitg1 = true;8 Q/ [: ]1 }+ O. C% _9 g
} else {3 m U0 k E7 ]" R; B" n/ v) J( i3 L( ?
ix++;/ y) C. V) a. g( ^0 u
}
9 J2 g" E$ _( R& W6 t% S; `3 Z }
* P# h3 |3 D/ c. }$ T3 C( _ }
6 |4 l8 h0 ?; j- B2 f3 K6 q. z3 `# r9 m% O3 X- H4 h# g4 e( Z) F
if (ixstart < 81000) {: T6 I$ c u9 y: S* U
while (ixstart + 1 < 81001) {1 f( Y; j6 r: R) h8 `
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {& }/ d; z, {0 i
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];8 h4 U3 |. H! ?2 C
}
4 K; d+ V# Q+ V/ d
+ T9 U: R- z* ? ixstart++;
% V- H5 x7 a7 @$ M9 @ }
. o! d& T& ?9 t- }0 H# z }
; [! _5 q$ P0 q$ \% l+ [: \, S& n4 n' [5 V
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
* d5 N* _: n6 P( i if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {; P5 e0 R6 A3 {
yiDuanShuJu_mean = mtmp;
# v0 f/ v* F. x* ] }; ^3 B9 i6 H, B
! P6 y. V- `# B/ n2 F c9 x /* 找出极值 */, `3 |6 x+ p5 O4 I3 T y- Y- X
for (ixstart = 0; ixstart < 81000; ixstart++) {
0 N; ^2 I: l" ?2 w youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
( P$ o/ @/ k. C& K' }' r }
+ u/ \6 j8 m1 A( z1 T
" X4 R3 e q6 l --------------帖子字数限制------------------
0 z) N+ ?7 S+ u+ ?+ o2 r1 \}' g9 d3 g; s, ?0 ~7 B0 t9 g
- D _- T# G4 o- s( B z
^* _# x; U$ D l0 l! t. Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|