|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
8 P, d3 g A- E G) U: k, o% S0 E' T! S7 z
各位大神:
) @4 [' F& k( `6 l2 v$ p 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)) W+ @' R, u+ q+ A" h+ k! ^
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
! t! Z$ _, Z$ r5 q, ~0 O) `. Y% s9 Z! c& @/ \( i \2 |
9 y* _, @- W; P o6 l4 p
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。& Y& s; P( V" ~% w/ S: [: H
. I: B) a3 A$ y O: d并没有其他线程" K" x4 E( D: f2 \
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。. w2 g* }9 Z( F" G; ?
也说不定是和堆栈有关系。。。。。。
3 C! r6 \- V; W2 r, W1 w* L请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....# s7 p: l3 ^9 }2 \) t8 ]% i
1 i" O! i& y' s9 J4 h8 A+ r
6 x z- {9 F7 `% N: [, O" g# A( E s" U+ A
我也很绝望啊,希望大神能帮帮忙,感激不尽,!. M* U8 o& ]% z6 @% j5 U$ t
2 I$ e% t/ O+ L' A" \& m
+ Y1 ^& \# w' R4 Q* Q) q( Q! m! k附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];. _$ i3 H0 F2 T$ j! N. @: O2 G
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。- ^ x- }% l y" B: v: ~- {. u
B* ]7 K9 R; d# Y6 Qboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(% ]* Y$ j" l1 P( L' c
const double data1000[1000]) {
. ]2 I2 T. ~/ p% a! U
' q+ O# y. J# A3 H" l( N int myfuck;
2 q {/ v* q8 z9 v- D! D. k double yiDuanShuJu_mean;
& @& e; b2 j# c6 o double yiDuanShuJu_LowMean[1000];& l- P' O. r1 d& Z; G$ _
int ixstart;
* a- U: c5 V- r, b double dv0[1000];
# m3 m2 c+ j6 X% |- W comm_AGC pAGC;/ J$ p% W1 P( q/ D( d4 i9 P+ e
comm_CarrierSynchronizer pFineFreqCompensator;
# o: ]: V! g- n dspcodegen_FIRDecimator pRxFilter;
. y5 g) N7 b- p. | comm_SymbolSynchronizer pTimingRec;
( n/ s) S5 V+ [( H9 F. |/ A! G comm_PreambleDetector pPrbDet;# `; ]& K( A$ ]0 t( s2 D& |
FrameSynchronizer pFrameSync;( B( q5 e1 m- W7 l
QPSKDataDecoder pDataDecod;
* [- J D8 V {: h static double usable_left_filtfilt[81000];
, \2 R6 U) I/ @9 k/ J% m static double youXiaoShuJu_QuZhiLiu[81000];
p2 {( A B$ x# D: n* ^ double mtmp;+ O$ s+ h3 Q+ u+ C, a; @, D8 n
int ix;0 B: V! P( k/ U( b2 N
boolean_T exitg2;
3 `7 i3 `, R `3 o/ r boolean_T exitg1;
1 _8 i+ f: q: I, J4 L double YiZhenShuJu[800];; F5 ]& i3 Y% y5 ^* }1 t
double dv1[800];
2 ^- o) ?# E- X c6 F8 R
+ @7 \/ y- C+ H, y" _/ w4 A6 ~: X# E: x) h) ]& I2 o
double b_YiZhenShuJu[800];
9 c% g$ T6 x! P; A7 R/ g double I_filtfilt[800];* @$ k& j. } ]. ~; C3 o3 N8 N
double Q_filtfilt[800];
. Z7 r: V, B- W creal_T b_I_filtfilt[800];* n& [" ?. A- [
creal_T b[800];( V9 Q# A5 W" r4 L( q0 ]& x+ x, M7 e
creal_T RCRxSignal[50];, _$ E: ]/ i5 M; z
creal_T fineCompSignal[50];
7 M' L0 o/ Z- w) y9 a4 x double phError[50];
$ {( p2 ~4 n) H: K+ U' p creal_T timingRecSignal_data[28];
% G2 q) _6 O: l+ O4 c7 P' B int timingRecSignal_size[1];7 S( N# |6 } }. K% M+ l {
double prbIdx_data[28];. d7 T! }8 @9 {+ j) K
int prbIdx_size[1];5 N5 U7 U$ s6 O% { {1 `. n
double dtMt_data[28];
2 [1 ?; |5 Z5 c. t! V7 K& v) C int dtMt_size[1];
3 P k# D7 ^ F% t3 ]- F1 E creal_T symFrame[25];* v7 x/ a! G, r( v% m' R
boolean_T isFrameValid;
! s( w- H" L+ [$ g, D4 f double unusedU0[3];
3 {. @) z2 V1 ^, r) _+ ~+ U; p* l6 o0 l+ }& U
//调试过程中的变量
) o G+ c0 f2 p int enough_data;" b6 P% K7 N, G* V5 q5 L0 ^
# U V' y- m# O int enoughDataFlag;
+ ?4 J6 a& y/ A- f/ M/ A int yiDuanShuJu_mean_int;
- ~+ k6 D7 _+ _ int int_sum_dv0;
7 m- m2 g) t! X/ P9 ? u int oo;. G! z: o5 l0 m" D
int ii;
2 H9 V, g% F; V: y7 n myfuck=10;
. L) |# O7 b/ W9 w /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
/ e$ O8 M7 o" h: P' W1 ? /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
: o& G: q7 ~( Y! v4 }* r( |. Q
( o0 v) w. G; |- L B& d1 e( x yiDuanShuJu_mean = mean(data1000);
1 n% V9 K [/ v) L2 s, F# q _! a2 z3 H3 p
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
. ^0 ^5 O5 h" V, m8 y; q UARTPutc('A');; A3 [% o1 r( K3 [
UARTPutNum(yiDuanShuJu_mean_int);9 G. B# }3 Z( k% }! m$ r
UARTPutc('\r');
! d- P) R# f- J UARTPutc('\n');) m t( S/ n E& n1 o8 T
; ]& X* O! S, J. e9 w. u
for (ixstart = 0; ixstart < 1000; ixstart++) {
% G: W P. P) I# X6 Z1 d; a yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;7 K z/ h7 Q4 X$ w" Y
}
p3 Q$ G0 b3 W! l3 Q1 b0 a- A& d' {% E4 y! k/ e
power(yiDuanShuJu_LowMean, dv0);# q" E7 f/ w$ Q
+ V! s1 X# Z I+ X0 J
int_sum_dv0 = (int) sum(dv0);4 _/ g" N O/ c% Z, B& q
1 C/ a, V' O% y P3 X# s, C; y# A" v
UARTPutc('B');
* @% I5 ] o; N! q9 k7 z UARTPutNum(int_sum_dv0);& [" \! K; l9 v8 D$ g
UARTPutc('\r');( |. f$ ]6 F" [$ L
UARTPutc('\n');- a s m- j8 C6 W% Q& R# z0 s7 ?
" J2 h+ Y. w, v/ a
// int compareFlag = int_sum_dv0 > 1.0E+8;
( s3 {1 k: ^ w- Q8 p) B+ r3 \* q" L7 d" B1 d: ~( D- ^* y
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
3 C% z2 D+ b2 {4 P. ^ UARTPutc('C');/ t7 a/ i+ Z* J/ d! i" S) Z8 _
/* 比较信号能量 */' w" a# @+ r3 X6 l- ^( p6 S. W; Q
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */- y {( F0 ~) k3 T- Z
// yiDuanShuJu_mean = 1000.0 * youxiao_k;# \$ N; D9 A$ C* H- z
// for (ixstart = 0; ixstart < 1000; ixstart++) {
& ]0 U: @- r$ b$ {- M' J/ F// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) @9 t' Y+ G9 ^' y
// yiDuanShuJu_LowMean[ixstart];% a, c) @4 \! Q! E1 ]
// }( M* L; Q4 s0 X$ J" s
//
& f2 |3 s6 E! V2 s// youxiao_k++;2 G9 U0 E, w+ E- m7 U# n
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 B" G# V4 V0 y K0 c// /* 感觉要取21个数,即0-20, */! E' C% S" O8 T$ i
// enough_data = 10;//有效是10,无效是0
% z+ V% B" A& C% D9 d// }8 s- b4 y ?7 J- \7 u2 |, u
}
1 V1 Z7 y4 ^ ^. e1 a* y* B
7 ^8 A* Q1 c0 L; R4 t6 B5 r* I( A u' n' g' G! g, q# g
enoughDataFlag = 100;
7 A( z: m4 X3 g" T enoughDataFlag = 1000;
: r0 Q0 b# r" M7 [- ], Z8 e. C enoughDataFlag = 0x02;+ T8 J9 w# v# `6 k+ _) e* e* u1 K
enoughDataFlag = 200;
, P+ i9 Q1 ^1 q$ V% \( K3 X: a$ [$ n2 L' x$ e" `
int myfuvk1;( U5 h$ ] O: c r
myfuvk1 =11;7 `3 n9 M6 N$ J5 S. N# B7 {
3 S3 q3 o$ P0 T/ W
* z6 @9 t" W. |' ]8 ]- Y enough_data = 0;+ k/ l4 ?; N$ \: V$ O0 J# ]
9 F+ ~6 i1 |! B( T9 d( ~ B8 @1 f
// if(enough_data>50){
& s2 e9 H. a. b// enoughDataFlag=0x01;3 `- Z: @ M7 x! {' \
// }else if(enough_data<50){; k5 x9 o6 [" d$ B9 z
// enoughDataFlag=0x00;//0x00还是不行, C/ m% {; O; T2 b/ b' i9 x+ W4 Q
// }9 c+ j9 K @- s$ o0 I: \9 E- x
; }- I4 D. t0 [0 y5 N! f. \
3 V% C1 D- X; l+ k+ P ]
oo=10;
: U, d) J$ T! q+ T oo = oo < 5;
( o2 t* c& P5 d* a8 i/ l; X# Y2 K" l if(oo){$ g* C5 c; a/ p1 A: _3 |
ii=0;
$ Q# f) b9 z6 a9 o6 ? }
& Z0 q% k: ?4 g& N# @7 F6 b if(oo < 5){
0 I. D8 o2 P! b' p ii=0;- ]6 t9 D8 k p* j& n
}
0 z1 p2 {' a! `) k$ h/ y if(oo > 5){( a. R) m' L/ d
ii=0;; c7 ~4 I. t& Y
}
5 l3 k# d( C9 d1 b- u; B
$ W$ ~8 V5 |/ [$ p, H7 G% P /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */! ~2 m/ G; h0 @' a! J5 M
/* 如果数据足够才执行主程序 */2 a6 L* _# g" X+ A6 S' U5 {
oo = oo < 5;' W; R: C/ q, I" S
enoughDataFlag = enoughDataFlag < 5;
1 N$ i% ?. ~0 \, d" H3 | if (enoughDataFlag < 5) {
" r' G2 P" y! y+ u0 n2 E// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
' d0 O; |+ L/ @# T AGC_AGC(&pAGC);
9 S& }+ A$ C7 Y! {: a$ R% c: P" ?3 y. |3 V
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
3 v& {* o* H! ? FIRDecimator_FIRDecimator(&pRxFilter);
& F; w7 ?, z1 Z6 l7 V! g- y; h$ @3 M0 v( y g8 _' {
/* Downsampling */
8 x: W7 d" o. ? c_SymbolSynchronizer_SymbolSync(&pTimingRec);8 ^7 a9 _- ` t7 ]( s
* x! O) k: c6 T6 @) M2 C c_PreambleDetector_PreambleDete(&pPrbDet);
. T0 r9 L6 V/ q1 k6 e( V5 q8 ^5 k' H' Y! T
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */# i, W8 x( G$ X1 ?/ z7 L# }3 Z. X
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */$ @+ P2 h8 @+ T1 [2 H
/* %帧数量=100 */4 l8 c A0 Q3 `/ i% Y6 y; ^" l
pFrameSync.isInitialized = 0;
3 @* q4 C8 R) p z. n7 Q9 W2 ^9 {9 A, d7 u
/* [EOF] */! H, h3 s# Z0 w3 l9 b
/* 前导码长度是13 */
3 v2 b0 J! r- b, k# X, p& X /* %qpsk */
/ L0 U& Z, H9 d9 y& D) |; W- ] pDataDecod.isInitialized = 0;. X7 J+ n& u6 V' k- I# ]* R
6 ~8 H& F& v$ S6 A( Q
/* end */
0 S8 [- S! L6 r2 \4 p /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */. ? P! p& G1 l' V5 k: F
/* Convert 3-dB frequency */7 n( m( g5 d. G3 h
/* Convert 3-dB frequency */
7 ~2 x4 r) {* l+ J! { filtfilt(save_buffer, usable_left_filtfilt);# o5 ]! e' G& P Z9 G
for (ixstart = 0; ixstart < 81000; ixstart++) {
, e; Y* m6 M. t a5 l o: B usable_left_filtfilt[ixstart] *= 2.0;
4 ], N( o, [, T8 J' U }& T0 ^$ F0 _( g3 q
5 _+ K1 ^: p/ p
/* 注意乘2,处理幅度 */$ U4 A" a" v* I+ V
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */: X* M' L( l8 l9 Q- `
/* %% 行列转换 */$ M' }& s0 S% K# P7 d
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 J5 B1 C' x9 {. Q for (ixstart = 0; ixstart < 81000; ixstart++) {* x! W+ V G4 F' h# D$ `
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
( ?3 b# }* r& V0 j1 v0 T1 ` - yiDuanShuJu_mean;
# D; X& y4 A" J4 K8 b5 n6 H0 q9 | }
- |5 h- |' r+ B/ E) j
! S6 N; I) \& y/ q; w F /* %% 应该对数据归一化,但是这一步放在哪比较好 */
P0 }- N: L: J. N1 K5 `6 u' U9 j ixstart = 1;
' l: F& O9 g$ h E9 i mtmp = youXiaoShuJu_QuZhiLiu[0];: ]$ g' J2 k& T2 G& O4 ?: I0 E
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. e# }1 v5 a) [9 r2 i+ p- ^
ix = 2;
. f W. W8 ~) R! ?8 o exitg2 = false;
: {- _- I7 X7 y/ F% @1 u while ((!exitg2) && (ix < 81001)) {6 y; ^! f; q0 e9 F+ ?7 d/ z+ W
ixstart = ix;. f: y0 a; {4 i3 o
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% V1 F1 j5 M- c7 M: S4 w; `, L
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];! g) G2 H+ R# f ?* Z
exitg2 = true;
- }2 j+ a/ Y+ C5 A/ n } else {; a' `) `* S) j, W6 |
ix++;
1 W7 _4 U+ Y5 Q, i }
5 m1 ]7 B# L) M \- v: z7 ?7 W4 w }' Z$ l+ u' S/ b( h# e' E
}
* }- x. U) B% j8 p$ L! a0 B' [
" v! T$ a( h, R$ Z/ R. s" _ if (ixstart < 81000) {
0 p( K+ z+ }3 N4 c+ m while (ixstart + 1 < 81001) {
6 G' R( ^: Y% X7 ~/ N5 C if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
8 t" _/ _9 @0 |6 l mtmp = youXiaoShuJu_QuZhiLiu[ixstart];: B2 e8 J; ^4 \; M& N9 P5 [! w
}! }% D3 H& k+ x: X, t, c0 |- T
* Q& B' L0 X6 w, `! z
ixstart++;
% B5 J6 R3 f" ?% ~" @ }8 H( M p: [7 w% j, P$ r6 ]" y
}
; L, H! `' ], T
* Q+ e, F) F+ q+ \3 q7 l2 { ixstart = 1;
8 B* O F" P9 m9 L6 d! P yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];- G* D* F/ `) J, b. E$ o9 H
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
$ { J4 s2 o! o& z# R2 } ix = 2;. w' q% R0 w* M
exitg1 = false;# z+ V8 B/ n3 o+ l
while ((!exitg1) && (ix < 81001)) {
( C5 o# ?" Q7 E* I: ?, c7 E `! v ixstart = ix;
- _3 g O8 u/ F6 [ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
5 W$ l o5 F& n8 \+ m, z4 }1 D n9 d4 Z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
5 A. e5 ]# q2 ^0 g8 { k! y exitg1 = true;+ z8 ?7 z! {: A1 d( @3 y
} else {
) U5 S' J" M6 o ix++;
- r M, G! t. e& K7 ^. s. C }
+ Y0 m) l: R% _& v* [2 [" d }$ \& s9 m6 P. ~4 j7 L5 e- u) E' q
}
2 H1 ?5 K; B) u
2 s; o0 Y: j9 Y2 ?8 w) O if (ixstart < 81000) {2 \$ z) v1 J4 |2 q+ l- ~
while (ixstart + 1 < 81001) {
$ h4 l4 w# N; B/ j6 v if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {! }. p* U6 N3 R5 {4 X6 D& O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];) y0 a7 V E2 }" w
}; j- U7 p, n- Y8 h
8 r1 O# E$ O/ Q2 }7 E ixstart++;4 ~, T- \3 S6 ?
}3 |5 T# c' u: o, N$ d3 W9 d; {
}
+ Y! {, S( Y" |/ @
" { Q) k: d! {7 m3 p yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
6 ?9 A: ?/ y$ j if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
4 E7 L5 \6 m3 t$ L7 n yiDuanShuJu_mean = mtmp;
" b$ F6 \" s3 c2 W: J' S }2 n3 @+ Q. O6 @# G3 M; t5 W
( b( h! s# I% U u% F /* 找出极值 */
0 p: R6 a% }4 ?3 p5 Q0 U for (ixstart = 0; ixstart < 81000; ixstart++) {
5 {5 m. e. q, z7 y. @# y1 U$ ?& Z& Y% ^ youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
) z% c1 t8 J4 p' a3 b6 y9 v( I }
5 o0 P; K3 }' F! B2 ]' z2 I4 I% K, f3 m' P" Z
--------------帖子字数限制------------------: g# e; {! x. y, f# s
}( {% c) n3 a, L
5 y% N. K, V9 r. D- {9 d+ P
! }4 r3 B4 R8 a6 |6 R) i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|