|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 * [. y& v1 Z8 ~5 n, y; i
7 E0 F2 s! p) V/ ~) f* R! N各位大神:1 f) E7 n" _* `3 j3 p0 Y. w- x
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
$ U/ j; u6 R" F* Y" v0 Q 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:. G9 ?1 T! z4 f5 |' |5 S; n
8 }5 H& c) C) u/ d0 L) `
+ ?' O3 g z1 K这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。( ~7 R6 |6 [9 q& {9 k6 P! n
8 n" r: k( ~- w4 d r: O
并没有其他线程
: B" R& b4 v! e* s Y9 E) y反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% X" i- e6 H2 ]+ \5 a
也说不定是和堆栈有关系。。。。。。9 {( {- H/ [/ k1 {- R. X( u+ l: k
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数...., o+ Q( z0 w1 O E0 d5 f! U% b( _
& \9 u, K* n# n: f( U
$ c" I( Y$ {8 |: L: Z* x
) E* u" @) g' V9 P我也很绝望啊,希望大神能帮帮忙,感激不尽,!0 [2 H' B4 J0 N( J0 i! k
) N3 ?# g T& ^8 Z/ z
* z+ O$ p( j8 ~附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
& n) i, Y4 A; j, ~/ `$ k1 B static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。7 _2 a( \' l/ w- a
' F+ O; J* g8 fboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
1 p# G$ m$ H2 M, T @ const double data1000[1000]) {0 Q; t8 B; I5 r4 t* N
1 b! `# i" i" b8 L o* T0 g
int myfuck;
( X$ x# _) r& Y double yiDuanShuJu_mean;
; G! U! ^- \! ~8 ?- j$ k0 m double yiDuanShuJu_LowMean[1000];
$ X2 i* @7 T* {6 C T int ixstart;( Q) u( _5 t, T, s2 a/ n, C
double dv0[1000];. K6 `& Z" r/ f5 z" |6 D
comm_AGC pAGC;
- O V- [ v/ N7 {# Y9 w4 g comm_CarrierSynchronizer pFineFreqCompensator;
' |6 T& |6 I$ s* F$ [! V) f dspcodegen_FIRDecimator pRxFilter;
% ?" I3 Q! ? K( D& S/ l comm_SymbolSynchronizer pTimingRec;
% b4 p6 [5 Z- Y" Y( W5 l; h$ ` comm_PreambleDetector pPrbDet;" M# v1 ]0 H0 [" p' {8 e
FrameSynchronizer pFrameSync; V" N" d3 |5 e" n( u) ]
QPSKDataDecoder pDataDecod;
1 V& z$ f1 H9 }0 e6 [ static double usable_left_filtfilt[81000];, [* W6 M6 w7 ~8 v
static double youXiaoShuJu_QuZhiLiu[81000];
9 t5 J( L6 y( A x5 {- u+ G double mtmp;1 N/ f! q" b( b7 K
int ix;
9 `: @" C% |& T0 h boolean_T exitg2;
0 U# ~* d; f, M# v1 e: N7 b* b% O boolean_T exitg1;
T: ^ k6 V# n6 L double YiZhenShuJu[800];
7 x( ^& c* j7 P. q double dv1[800]; x" J$ G* c U& J
! m$ n9 d$ F0 e3 ~/ Q. U9 c0 W* e4 J6 e- c q, E
double b_YiZhenShuJu[800];
- X; ~2 g; r+ s. S }. _ double I_filtfilt[800];0 n, h2 h2 f a7 ^! h0 A0 l
double Q_filtfilt[800];: n8 `0 ~8 `+ G" z
creal_T b_I_filtfilt[800];! O' {8 |+ _1 `. i
creal_T b[800];
9 W* p2 l: @8 q6 G M% R- w creal_T RCRxSignal[50];
7 O. o+ A1 q8 n creal_T fineCompSignal[50];% k7 I9 U( t; \6 s; y r
double phError[50];
( o" ~. I `, r& u creal_T timingRecSignal_data[28];9 ] g+ T3 q9 E) u
int timingRecSignal_size[1];
8 b: d, l) h1 d( C" v+ K/ Z double prbIdx_data[28];+ C6 b9 P0 f: {4 D( H( c& |) X* J
int prbIdx_size[1];
3 A9 {& l) b2 [3 B; c# @7 f9 w double dtMt_data[28];
5 I! r* v* c: T/ e2 T6 Z int dtMt_size[1];
x1 s. H1 i8 ?% @ creal_T symFrame[25];
8 ?5 H p& r) a& M# ?; K' H. Y boolean_T isFrameValid;
* [1 x" C5 F6 O$ \1 L9 v8 l. t( B1 z9 F double unusedU0[3];( S) ?6 Q/ t$ O$ L
, a" f% K: }- j& G" y$ U' B //调试过程中的变量" u6 b& M$ E0 T
int enough_data;
; L! W# p: B$ o7 G, h g [: Y
I* Q% B' K) | g' w' X/ k5 f int enoughDataFlag;
4 e6 N$ O s3 O* c int yiDuanShuJu_mean_int;
0 L5 q5 n/ Q# _+ L4 @( \1 Z9 L int int_sum_dv0;3 \' P7 \9 ^! A1 p# p' b6 C
int oo;
, d+ v8 n7 r# U' K int ii;
$ G" s& t, C/ K5 j& [' ^ myfuck=10;
: ?5 a* G1 v8 }# z* w" o1 j /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */7 _; H& o) b. c4 T' v7 ~5 R ~ H) }* J
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
6 }7 ^9 d+ L1 v
0 R5 L/ [1 E0 R7 g7 P" G yiDuanShuJu_mean = mean(data1000);. L! `7 }( |1 ]0 F/ d. S8 i. X( x
; ^. c7 \/ G7 n% f yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;& c7 o0 M( F4 t" N9 Z& z q
UARTPutc('A');
; E5 g7 ?( H: X; }; f UARTPutNum(yiDuanShuJu_mean_int);5 d2 p0 d0 P5 R) c0 r0 T
UARTPutc('\r');
. A+ \! I1 E" F' A UARTPutc('\n');( H- y7 ]5 w& ] y- z
" o/ W2 M. B- f5 l4 l) S
for (ixstart = 0; ixstart < 1000; ixstart++) {1 t, G; L$ _! z/ A* |' X/ V
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;: Y6 K- Q0 e R
}3 k- }& N( i: j- [
9 G! `7 L% k% `
power(yiDuanShuJu_LowMean, dv0);2 R. ~: s ^: {' p
9 U# t7 ]0 ~$ e1 q* I
int_sum_dv0 = (int) sum(dv0);
" z) L8 @: }. h, n3 X9 _( T
/ ^6 [( M# {( ]' v+ g UARTPutc('B');/ O- o, c+ z9 M3 R' B
UARTPutNum(int_sum_dv0);/ \& r. x5 p& `% |7 _
UARTPutc('\r');# B. O% W( q+ D5 C. j
UARTPutc('\n');
. m9 {( E l) F
6 h+ X ?% l! q1 f. m# s// int compareFlag = int_sum_dv0 > 1.0E+8;( v* I( F$ @; X( g; s+ K
' n% \4 F. w* G! y: k! \ L
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗? b A; K( J2 P7 l, l6 V5 r( T! b
UARTPutc('C');
, @) S& i' Y. C* K /* 比较信号能量 */
. h$ l( z) h9 X8 I1 y /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
4 u( K9 G- e7 |" U1 O; |// yiDuanShuJu_mean = 1000.0 * youxiao_k;
, t" g6 Y& Z( B// for (ixstart = 0; ixstart < 1000; ixstart++) {
5 M8 n. ], X. I) |1 R& Q5 Q9 C! \- S// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =: R8 _& a# ` C0 T
// yiDuanShuJu_LowMean[ixstart];2 P# h* K* d- J
// }
7 ~7 F8 V0 b! U. B- l$ a//
' s" i; ^! Q. N& y6 O- b% g// youxiao_k++;2 e) Z: x0 h( Q( Q8 u
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==3 ^, }5 N( J# ?
// /* 感觉要取21个数,即0-20, */
7 D( m4 g2 w+ P- O- W5 ]) P/ n& l% y// enough_data = 10;//有效是10,无效是0$ ?) L4 G+ `; M. E/ ^
// }
1 u9 z" x3 C2 y" b4 K8 e0 E) C8 i9 R% \ }5 }5 l1 E( } L7 z0 z `7 X
# f& T0 q& |& t* t4 t6 c% p# w. e+ |$ D7 N$ l% t* y: e
enoughDataFlag = 100;3 B* d; K( k; N$ C9 A# M
enoughDataFlag = 1000;3 l5 W) A- W& [. R4 M3 ]( h1 g
enoughDataFlag = 0x02;8 w0 R+ \" b6 H! L( A, L; a! u
enoughDataFlag = 200;: E" M# s! w) T: L0 Z* v
2 P2 F2 W9 t; x4 J" V2 k int myfuvk1;' T$ L T! C! N8 C0 _
myfuvk1 =11;
0 I" H* Z, \% _6 G3 |8 ^7 [* N' K- f7 ?5 Q2 l
% _' g0 b( K* x/ T3 n( \
enough_data = 0;
3 e2 ~9 a; q1 d" C4 K; u# g
8 E2 \5 f1 s. \- c) b- R/ ~// if(enough_data>50){
$ T# D1 G. k$ d- S' B3 I5 }// enoughDataFlag=0x01;% G1 C8 L2 ?7 M+ T4 j i2 k
// }else if(enough_data<50){3 X8 t8 y T7 u( Y5 l- b; U
// enoughDataFlag=0x00;//0x00还是不行6 U8 B2 s) p1 B4 m' b
// }
! x. K, m+ c5 G' l& i5 O: ]: m$ Y: |
9 y# I+ n+ E% G2 _2 W5 n( j
oo=10;
]" x! ` c. T) F oo = oo < 5;
. J1 f! p& d# P3 p* L. ]( d, w" t if(oo){
. B( @6 T. X2 e/ P7 q, D# S ii=0;
9 n# j2 o' x, y }
- D @: D* b- E, `# x( n! X if(oo < 5){
) ~& f( m# L% `8 f7 I/ X+ y& Q ii=0;( c! z7 D; K& F; m8 d2 [6 S
}6 X* Z5 [$ T% y4 _% K* a
if(oo > 5){' V: H% [- t: d
ii=0;2 h" o. l# o4 y; P$ N
}
+ B! x4 C4 v. c1 H6 R
+ z6 {, b! m) [- l8 o, Z0 |+ x. l# } /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */( b( a3 u$ {/ O
/* 如果数据足够才执行主程序 *// l& X* }9 M4 Y+ l* f) [( F
oo = oo < 5;8 e1 r* B' W9 w
enoughDataFlag = enoughDataFlag < 5;
6 x) v# H/ n- t2 r& n if (enoughDataFlag < 5) {
" O0 d- G4 h! T9 I& }// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
! Y* a; _2 l- v' z! u+ u5 D AGC_AGC(&pAGC);
1 I0 ~8 g. c' B9 E7 e( c# X1 Y2 q
. {- u5 j" L v- M& A/ `3 c* Z c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 I3 W( c- V( ~" L
FIRDecimator_FIRDecimator(&pRxFilter);" J$ Q3 D8 c- @1 e! A
* _9 L7 C% i, o3 o' E /* Downsampling */
0 h3 G" F; E7 h c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 t( S& U! y6 E
& K, O8 ^! _5 n( b1 o! M2 i6 j; \ c_PreambleDetector_PreambleDete(&pPrbDet);
6 F* h8 T% U+ b: L* J( _4 S* f v' @ H! A( Q0 b
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
8 K J. J% j" e& P; D" W /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */3 s0 p9 b* Y5 I7 c! `
/* %帧数量=100 */
8 S3 g- g+ K+ v$ o) u/ c: ~ pFrameSync.isInitialized = 0;
L1 E7 D; F+ i
) m6 n1 _4 Q7 Q* |5 k5 j' ? /* [EOF] */
& \# p% t: R, G /* 前导码长度是13 */* [/ I7 p O; d: g: r3 T$ P1 e
/* %qpsk */, N' k$ ^9 \ M3 l3 |
pDataDecod.isInitialized = 0;# u( c3 A4 t( g R2 K
, ~ T- \3 _( Z /* end */6 W" B, \1 P6 Y/ [2 A
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
0 x& l- p) q. n' f5 v! i /* Convert 3-dB frequency */
% T8 a, i* a# X5 B /* Convert 3-dB frequency */
' U& K! v6 |: R5 s( F filtfilt(save_buffer, usable_left_filtfilt);
, |" _" v/ Z& Z* M for (ixstart = 0; ixstart < 81000; ixstart++) {
/ Q5 z' W( F' y- a3 o3 G usable_left_filtfilt[ixstart] *= 2.0;
! L4 r! b0 T: F- s/ U) f* r }
3 W! R1 n- U! W- A$ n4 k2 \- s2 x% O& T2 E0 z. X1 H$ E6 B
/* 注意乘2,处理幅度 */
! v- g& N' }8 n* w9 @1 G /* %% 我发现带通之后其实就均值为0了,不用这一步了 */3 J# Q6 F2 i: j$ n' L2 K
/* %% 行列转换 */9 X7 ~" i W0 X% y4 i3 j. a7 q
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 Y7 \ D0 d. M. \
for (ixstart = 0; ixstart < 81000; ixstart++) {
* w' U1 r- Z; h youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
0 S1 _) ?3 s" `* @* Y* D( c6 v - yiDuanShuJu_mean;
4 y. {6 K! o, ^. ~ }3 {3 t4 a* g: h2 q
9 o- n2 C( }+ T2 l" R6 ` /* %% 应该对数据归一化,但是这一步放在哪比较好 */
) |" _8 c2 {/ D3 U ixstart = 1;# N% l3 @' R+ P/ x
mtmp = youXiaoShuJu_QuZhiLiu[0];0 q9 F. H/ Z8 ?7 B
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
, k! B! Y6 Y' ~$ b' M; i, u/ c# u s' | ix = 2;
6 V; {# [7 `( h' d* P exitg2 = false;
7 Q. v/ q7 C7 \& G/ r3 f while ((!exitg2) && (ix < 81001)) {, m9 [& ~; j. D: C0 }: r7 W
ixstart = ix;
; z1 p3 |, h' o7 m) n: i if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 h) w4 j' ~. B$ x% M
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];$ F u$ u; L. a6 x7 ]5 n- x
exitg2 = true;
. ~% y% D! C+ P/ Z5 ^- e( V } else {
. {: `. h1 d2 c+ m ix++;9 e/ T- P0 n2 u
}9 O7 V! x7 ^$ f+ z- K, E, y6 j
}
0 I( e, Z) l/ e* m( k }" @# Y7 r A/ q' ?# z( D
+ e6 _3 d+ ~5 _9 X% X+ b( ?$ k7 a
if (ixstart < 81000) {) B4 W9 ^1 r% c7 W
while (ixstart + 1 < 81001) {' q( N8 d* z1 G8 [ R
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {/ B" V: T. Q. F6 n& h
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
! |! o: C1 o0 W; l; o) \ }
, @+ A+ s K' o8 G6 e2 `3 p* B" ~2 f' D! E
ixstart++;7 p2 p. w; p! w. h& @* o7 A2 T
}9 y y! L) p3 b+ O7 o4 O
}/ O$ [: p0 b6 K7 `* g0 L" k
1 E9 D& [7 o1 Y: F
ixstart = 1;3 y! `: z# i. J% i
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
! N8 b3 w5 A# c2 L) e. u if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {* S! [2 h) N3 H
ix = 2;7 c$ k: x/ L! X% b& W6 e2 U- m
exitg1 = false;% @1 T/ M9 n. |
while ((!exitg1) && (ix < 81001)) {
7 p- m Y U' q$ ~5 ^5 ` ixstart = ix;2 P; F2 X6 X; {8 t6 @# n' D7 x+ c
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 J* `% T" R5 B# n& F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];: r5 M8 p; ?6 E! n; b I: o3 U
exitg1 = true;
K. @9 K2 {$ F6 s } else {
' o: n% [* V1 c( ]: ?4 i4 x ix++;5 _; b5 U( C( {
}
* B1 I, T- B+ ~# f8 ]0 S }, G) m9 ~, P1 H7 M* U) l& w
}
+ `; x: q: j: q% M
. Z4 o2 A/ v- \2 r z if (ixstart < 81000) {
! G: e- d: i' r1 ^' ]- E3 x3 I while (ixstart + 1 < 81001) {
) Y: H% N; L& x7 S/ [ if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
i& c; z4 T4 D; S yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
) H$ j; A2 d) @; S$ M; I" G: _1 R; L }- l2 r+ E: I# W
6 j3 V1 b7 Z; L4 `7 E" ? ixstart++;" u" t# @2 w, V
}
4 ^( k2 b( n: h* K G* m+ C/ i- s }1 u- v3 |. n1 c H! x% C' Q
1 t: J7 o: P0 M6 M' x
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);' w# M ]0 k6 s% S1 s
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
- C% _- v. T: B0 D; k yiDuanShuJu_mean = mtmp;
# D ]! ]5 I" I5 q! B/ a. s* L }+ c; u" r2 B, d: }. T; S
5 h, q6 Z6 k8 v" Y8 ~$ w
/* 找出极值 */2 y! x3 p1 `" u- z
for (ixstart = 0; ixstart < 81000; ixstart++) {; e7 p* i, r3 X
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean; a4 j" u3 e2 q( J
} X) [; D' u9 h. T
* |$ I! ?6 W. \. h# z m --------------帖子字数限制------------------' c3 I, V8 w! R2 G2 g. h
}
, B/ }. p; o; N& [( b
; P9 M+ A- g. P/ @. I n: u! z1 I9 K$ G% p5 I
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|