|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 / X7 j9 G; P9 t; Z
) m( d3 m- v, C% D% v; h8 G: _各位大神:9 l- c2 m* i# n' C/ r4 Q( q
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)4 K( n+ g% R* }
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:' }3 A! U$ M2 j2 \; \- S$ c+ N
* v6 G9 Q, E2 L: J4 k3 B
/ j \* g* A: e; g+ E
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
! U) j, C0 M: x8 n) g" j' |
3 N* p0 J* R d2 h6 E9 ^8 ]并没有其他线程
1 e- `* R: y8 S. x: G$ J反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。. s9 M( ~4 K7 Y5 S) k9 e6 B8 e* \
也说不定是和堆栈有关系。。。。。。
/ [8 l f: u7 ]! k0 k# c请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....2 P" q2 L( s* `/ z5 e
+ u1 {" k: A% e# u
2 j. T4 h4 T ?1 W( C2 A
+ {4 }. B$ `' X6 i我也很绝望啊,希望大神能帮帮忙,感激不尽,!: N& s. {; U2 q5 p9 g) x
( \! I, v* R1 U7 ~
k& o" H n/ [% J, |附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];' B1 V! B6 b5 A6 D8 ~
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。& {. e! v$ i! \ f* G1 l" p
, B& w: i a) F( [ L- b
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
, c1 F1 ~' D$ k$ X/ P const double data1000[1000]) {# Z/ \2 j% d8 a$ ?) L0 p1 [6 x
7 J, ~/ _) H9 [0 k
int myfuck;0 Y: H' P3 i3 A; M% I
double yiDuanShuJu_mean;
' Q2 K1 U" c' j5 O: ~3 z double yiDuanShuJu_LowMean[1000];
) b( l! S7 ~! O% `% J( A! o: t int ixstart;8 }: P# X! F! B( {
double dv0[1000];
0 L9 Z+ V$ Y4 J7 `! W7 |$ ~5 j comm_AGC pAGC;
r% a1 K7 W1 P comm_CarrierSynchronizer pFineFreqCompensator;8 v# G/ m: c" t% |& M a
dspcodegen_FIRDecimator pRxFilter;
- j0 g# _6 i4 }5 p- t1 F# A$ i comm_SymbolSynchronizer pTimingRec;6 P6 f: c# t( M) u5 I f. ]: _
comm_PreambleDetector pPrbDet;
3 e2 X1 H& \6 b$ Z( o1 y5 x7 f FrameSynchronizer pFrameSync;
6 ]' A* [6 E& |+ Y7 Z$ l/ i/ ?! | QPSKDataDecoder pDataDecod;* j; b/ I- O1 G! p5 u% u
static double usable_left_filtfilt[81000];
" N% K# H, J( L4 o static double youXiaoShuJu_QuZhiLiu[81000];6 y* | V4 J6 s
double mtmp;
. m3 y. B' R/ j' e: J, Y$ q* e int ix;! j: D' E+ i: ]$ z
boolean_T exitg2;5 `: H* G+ k7 x7 V) q" u& t8 c. |
boolean_T exitg1;
) f9 N; u7 x' K# b( Y double YiZhenShuJu[800];
# ]& x$ l- o/ d( x5 Z# {% m double dv1[800];1 S3 a/ u; }" w
p9 ^+ p& @' K8 ~
$ b Q( {! \9 g/ k" V" G6 t
double b_YiZhenShuJu[800];. O7 n( L0 R2 z' c2 u
double I_filtfilt[800];
; N5 C. o; {+ a9 v* }/ d$ F double Q_filtfilt[800];$ I: V* T# r* X3 N6 l0 F8 @
creal_T b_I_filtfilt[800];3 }1 p! Z. U3 ^' O+ O
creal_T b[800];
! P0 s5 S# \2 {+ ? creal_T RCRxSignal[50];, |; e( m0 e6 M8 j5 B, v
creal_T fineCompSignal[50];
|' {, y' N, y# S$ c# W double phError[50];, U* Y6 w4 b: q' j) l, R
creal_T timingRecSignal_data[28];
3 l# P- ^ O6 g5 t/ L1 N int timingRecSignal_size[1];
# c: H9 w6 K- x* _- R! {; d# n double prbIdx_data[28];
8 X6 y( \8 G/ u& h" U+ K int prbIdx_size[1];
5 H) `3 N% I5 E9 N: g double dtMt_data[28];
$ o5 u; W9 r* t2 Y2 M int dtMt_size[1];
. j* m. D& m- e creal_T symFrame[25];
; @6 g2 s- y8 H boolean_T isFrameValid;
% R# t, N5 x6 [2 i+ j double unusedU0[3];# J" J3 T% Z. D* C7 m
1 L D6 n4 P2 e# U5 m
//调试过程中的变量6 B, V9 p" \) Y9 ?6 u
int enough_data;
# L- S$ m; m7 N& q7 P. W9 l
5 u. v2 X4 Y' Z4 e int enoughDataFlag;" e; l3 I' i0 F! \1 O! y
int yiDuanShuJu_mean_int;
5 p5 v4 \, c5 y5 M* D int int_sum_dv0;
2 o2 ~+ L! G1 I5 ?) S0 n7 O int oo;7 @. j8 i' |. U' X9 u8 \7 N
int ii;5 [6 Y; Q& J6 b* b" \
myfuck=10;7 \) j5 d" {& G1 q# T! V# Q- u8 G
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */3 V. H* z l2 y$ l
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
. D0 D" Q7 @( d/ _: L2 H
) `5 a( f( X# M. v) F+ [ yiDuanShuJu_mean = mean(data1000);
8 p" v# O: [4 T9 E: s& X# \
! Q3 x8 L4 z) Y( w yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;/ J! b& y; ?- i. H F
UARTPutc('A');" l& ]7 Q8 B4 r; ?6 p
UARTPutNum(yiDuanShuJu_mean_int);
H! Z1 F1 S8 u- O UARTPutc('\r');
8 u# u+ E0 J3 C' @& P UARTPutc('\n');5 D' s6 z2 K2 _" i" L
. _+ b- O* t$ N3 r& v0 w! c
for (ixstart = 0; ixstart < 1000; ixstart++) {
7 V- \3 P' X$ ]* X/ T yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;( t/ ^, O4 D8 ?1 g# O' X2 d
}* C7 W8 B( g2 o0 X N: D( K' s
' }3 _3 {0 w% w2 P7 O4 Z power(yiDuanShuJu_LowMean, dv0);" X! y g4 E' ~% i% u
( W9 L L) s5 W, }% ? int_sum_dv0 = (int) sum(dv0);
6 ^; ?0 p: e" Z+ W" t
$ y" Z5 v/ A9 ?# C8 P. E2 a UARTPutc('B');, X8 [2 ]- v, ~ a
UARTPutNum(int_sum_dv0);1 e ]7 ?2 ^9 D8 I, ?8 r: t
UARTPutc('\r');
' v0 b0 x. ]" B( t! d7 x UARTPutc('\n');
& X/ H. b. Q& [& _3 H( d! a
, O9 s8 O" T& e" a; s2 n// int compareFlag = int_sum_dv0 > 1.0E+8;
6 ]9 t5 Z' q/ U4 j/ Y) ?" y" I. }: V
# `) G5 \. j% @5 ? if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?5 h$ ^+ u' d& E/ G3 I- \9 Z: _
UARTPutc('C');$ ]. X+ o% s q1 \' @7 M
/* 比较信号能量 */" p' R. w/ ?5 h2 ^: G! @
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */4 u$ p8 l2 e2 l6 L3 M# B( b& y. h# g
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
. ?! Z( t2 S+ o+ }/ q8 z' @// for (ixstart = 0; ixstart < 1000; ixstart++) {* ~- z. u& n3 f, X# L
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 f' L& T2 w! ]- N
// yiDuanShuJu_LowMean[ixstart];
& d, x; w0 M4 ^3 m// }4 Z3 r7 x$ P0 J, q- o, D: h
//: V6 s8 o& f0 X$ U% O. K3 @: n5 B
// youxiao_k++;
a5 W6 D+ }, U0 W- E$ A$ c6 b. S// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==* Q0 H/ M' a* M: H' h7 J
// /* 感觉要取21个数,即0-20, */
8 S8 u+ f0 \+ `. x# P; Y// enough_data = 10;//有效是10,无效是06 X5 T9 x# F( A3 L8 C2 j
// }2 N8 z' n9 e; V
}1 e9 a5 P; m8 e- x+ j$ u
2 U" q5 C1 y7 H! T
/ u* s7 a! U" ~/ d+ Y* v. F
enoughDataFlag = 100;+ q( z @ r K
enoughDataFlag = 1000;8 @) s) T% K5 r5 a3 n0 U
enoughDataFlag = 0x02;: K3 a$ [, A: n4 S( c" N
enoughDataFlag = 200;
% g5 L/ Y9 A3 W `) B2 t5 ] u8 w4 g/ u7 X" E" r* s/ S' G! P
int myfuvk1;
. u! O* X# X( | myfuvk1 =11;
: f) Y9 a# e9 r/ z1 x9 v
# @0 U# t& E: r% q2 s# M* \! z/ Z; @
enough_data = 0;
% t' V, g# r, ~$ `9 [% h9 m& O
: @! J1 Z$ F7 C( d# ?4 F+ C// if(enough_data>50){
1 ^) G8 q, c1 A& N// enoughDataFlag=0x01;
" Z- p' }; B. P' J, D% ]4 [// }else if(enough_data<50){
( n: K+ k2 S) l" n, ]* O// enoughDataFlag=0x00;//0x00还是不行6 q. |6 A& J, }
// }$ c! K/ v: i" C" P- h
' `& C9 P. c* p k7 N( L
3 p6 h2 ^* |; h* w oo=10;
9 l d4 i8 z" d oo = oo < 5;
# j: s" v% G6 Z* Y: i! m$ ~ if(oo){' ~: h$ f9 o0 Y6 e$ ^" x% {
ii=0;
7 ~8 U! C8 O) @8 F* B. F }. b9 `: B. s! W
if(oo < 5){% w. l! u" Q- q r4 a
ii=0;
! I+ M. W; H+ A }. V5 t* C! o9 W. ^4 h% v
if(oo > 5){, q( m4 q% x, J" q* Y
ii=0;$ r1 A8 u! D `3 i
}
4 k! b! u2 T& w0 z s; o! Q2 g+ G$ M
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
: e4 r3 a6 _$ m4 o2 c) j1 U# t /* 如果数据足够才执行主程序 */
8 _, Q$ V: i, x/ | oo = oo < 5;4 K* O7 S, Q, v
enoughDataFlag = enoughDataFlag < 5;
4 \/ |$ f8 S( o" b5 F) z# l( E if (enoughDataFlag < 5) {
+ l* s w1 J0 M$ e# m N// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
: G' g# R& c5 P9 N/ S AGC_AGC(&pAGC); Q8 [3 T8 M% e( Q. J# w3 \9 u
/ X. ~3 \: k |* ?
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
4 @- h$ k, n% u9 v0 T- Y FIRDecimator_FIRDecimator(&pRxFilter);
% H: }- y' {- e* j' I; w& z$ k& c/ {1 i; w" K* R
/* Downsampling */
9 i0 e @: b5 r# ` n# Z2 O. A c_SymbolSynchronizer_SymbolSync(&pTimingRec);2 x$ L& L( `" z4 D
9 V, K i3 f( }+ j/ x% y b E c_PreambleDetector_PreambleDete(&pPrbDet); y4 Q5 H+ g' t7 U f& [
% `6 m- I+ A& h) x
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */7 e$ R1 e& F: B1 C) L
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 {. E6 e1 W' |0 X1 Y9 F5 U /* %帧数量=100 */+ a+ m3 `: Z7 o6 x' g! e* Y
pFrameSync.isInitialized = 0;
! W$ G( x* [9 c9 ~* D! Q+ M8 Y C0 M1 V0 m
/* [EOF] */7 R9 _! F V3 f# ^2 G0 \7 a! A3 S
/* 前导码长度是13 */- N) [/ w) \+ F7 o6 c
/* %qpsk */
) X# R, u& P* d, }6 b$ ?) z6 o pDataDecod.isInitialized = 0;; X# r- T. ~- E6 O8 @; c7 M
7 S# A6 [2 a: P; h& |5 M0 @5 K n% {
/* end */% i4 ^4 O$ a4 y$ u
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
) V7 L. `0 B5 Z1 R0 }0 D1 k& d' k /* Convert 3-dB frequency */( h8 W. L# o; D! T" K' D
/* Convert 3-dB frequency */
) r# ] j1 E$ E' Q w filtfilt(save_buffer, usable_left_filtfilt);+ _, e# _, L {6 M. u2 [$ @' f
for (ixstart = 0; ixstart < 81000; ixstart++) {0 w3 z) l* h: [! |6 ?
usable_left_filtfilt[ixstart] *= 2.0;4 S7 X2 w% I- W' ~5 W& B0 y+ ~- y, V
}8 o% y% n7 q: J/ Q
( D" J- p$ q- O2 u2 D- {
/* 注意乘2,处理幅度 */+ k$ }1 M/ }+ ]
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */( [- H [( {) k& }) q' r
/* %% 行列转换 */
9 l& Y8 I4 u$ h; J i$ v2 @% C yiDuanShuJu_mean = b_mean(usable_left_filtfilt);! y/ W7 q+ h+ L1 a$ X
for (ixstart = 0; ixstart < 81000; ixstart++) {8 O+ u0 t3 c, |/ g( R [- m
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
) \8 {4 Y1 u7 k& @ - yiDuanShuJu_mean;
' P8 E2 I2 \, e6 g+ Z }
$ Y9 H7 Q3 m8 A Z1 f
- Q% b; I# n% F0 x1 j# E) i /* %% 应该对数据归一化,但是这一步放在哪比较好 */: x D, `2 n9 A, Z3 a& T0 y
ixstart = 1;" b e; H a8 c- R2 B
mtmp = youXiaoShuJu_QuZhiLiu[0]; \! }# Y. g8 ?- ]' w1 t
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {3 R6 Q4 W W, f9 P8 x0 b
ix = 2;: C/ r9 B3 }' r! m3 j2 u7 I( ^
exitg2 = false;: d5 L' J8 h1 n% r1 r7 L% R* _5 H
while ((!exitg2) && (ix < 81001)) {
" E! u7 {0 K' e5 M& i/ P ixstart = ix;
/ O0 r7 K3 q6 D, q3 T U: a if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 h6 H( Y' V0 N1 x& ~
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
$ a4 i g/ j. X# j1 U exitg2 = true;: `1 ~+ y" O; K2 T! \
} else {
$ ]0 o6 g! @/ f ~ ix++;0 _8 b2 s8 M' J/ I6 H9 X
}
8 t, q, I( c7 x7 ~+ _8 { }# y5 [9 ?6 x; S8 J4 r
}9 x; F3 f+ }' I: S0 b
1 A2 \+ ?( X$ h( P z6 i if (ixstart < 81000) {$ Z2 B& ?& V# b
while (ixstart + 1 < 81001) {8 e) N" C% H# U: B9 ]
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
0 o7 g* V" o y' W% V* Z mtmp = youXiaoShuJu_QuZhiLiu[ixstart];, @% N3 H6 A% ^* |# P
}
- ~1 e# b6 s" T5 t( m$ Z9 e5 p j. V2 _3 b3 v
ixstart++; ^0 N+ f( \. G0 G
}
! `. c/ G- k+ m4 Q) f; U$ Q }
. j$ ?% n2 n7 t! i. ^. i4 u1 f# q. u) y7 b4 @ X( u2 G! U
ixstart = 1;
5 @9 `' f H' B% M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];0 K+ E& N2 H. c \0 l! B* N* x
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {6 u4 t2 J+ m: m( O* O
ix = 2;* D# U! T' [0 |' |& g9 C
exitg1 = false;
; ]0 J; M) l. q" t3 f. Z. O- s while ((!exitg1) && (ix < 81001)) {) Q- o* b" W* N' e' `% h
ixstart = ix;( U* i- E( s2 i w+ J) R, ?
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
$ R; y% B0 q M, U- p& q- W yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
# Y5 D+ B6 W& V2 ?8 a8 _ exitg1 = true;
2 X2 X/ @* I; U+ m8 s7 W } else {' u3 D, R1 o' W) v( @7 E
ix++;
. _" p- }' v5 g }
2 `9 s- D6 J! [. z9 L% f }
' H6 u1 o; X. g }; f0 A7 ]. c6 E! W) ^
1 \. R% x+ Y$ e0 }% i if (ixstart < 81000) {
' b' N% T+ s! o while (ixstart + 1 < 81001) {0 c8 _+ F. `# G9 J% `) @* w, v
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
% K, C8 ?5 {% d9 d2 @/ M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];& U6 A+ _: r+ Q' W) f
}/ |1 q5 U2 B/ n8 y+ o1 h& W4 V5 l
0 }: _! ?- l2 L- f
ixstart++;" J( g" x9 T# E
}
1 z3 x+ R. P% H' |/ E9 N }1 t, ~2 n8 s& t9 r% Z& U1 R1 m
: ]! W: n$ A, {! ~& \4 l: c
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);4 E% w" m9 N) c& G! k) |
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) { c' ?/ e {9 P. Q! {
yiDuanShuJu_mean = mtmp;8 {/ Z& R+ ^. S& N u& ]9 l$ B
}
; g4 ^* \0 W5 s- Z" s
/ k5 I# g& F, `2 E" a2 _! c /* 找出极值 */
1 \( X3 L1 u* s9 ]; O% {+ K for (ixstart = 0; ixstart < 81000; ixstart++) {
2 Q3 j9 Z0 u3 ~ youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
2 r+ q0 ?% c: _5 `. `9 N4 t }
! c( [2 w, _! Y6 i. o, I- x+ u$ d& n
--------------帖子字数限制------------------
$ f4 u! Z1 P5 k% B! K, C0 u2 R! U}
5 F' J" E- }& Q+ z, S: x1 M- ? o9 w! T; Q- i% y
$ t. H- p+ c( h% `3 n1 U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|