|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
2 _* v, [& f% p& S
) x( A5 R0 U ~5 t* ~' |0 A8 w各位大神:8 R0 G/ `% g; N8 {2 t# J; f
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)! Q+ N* c2 g8 r( M" e; M
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:( K/ p- \/ P$ u
; c& p8 T" J: [9 l0 U 9 E! ~% P! C, d V$ D
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
1 {0 g7 A8 I% g/ d4 R
- n6 H1 m& h3 w+ n; k0 a/ e0 |并没有其他线程# l/ ] p) p! }, [+ y
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
% o8 Q2 ?# s: P. G V也说不定是和堆栈有关系。。。。。。
% O; J5 t1 G3 e1 J7 f5 l' s请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
" W2 f( Y* K, U# _# Y$ T$ A" l z0 D" u
e9 V, Q- f2 C! h+ K
1 F2 }; R$ i! w9 V+ Q我也很绝望啊,希望大神能帮帮忙,感激不尽,!1 x4 K% r% {& A* R8 X$ z
N, j6 Z) G+ b+ p) E( r5 O) \" l- U
$ Y- D/ z+ A+ ?# ]& q4 o附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];, t9 a& h* I6 G" o* u) s- i
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。' z# J9 }& S( L4 I5 Y! j
0 |9 y, Q$ ?+ I' n8 W, }
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
$ n# Q( m+ y, D" F5 \ const double data1000[1000]) {6 L0 Q. l0 a( I0 `
2 A' G0 F' q: ~8 h! S int myfuck;' G6 ]" H8 c/ X1 ]9 K4 r |
double yiDuanShuJu_mean;! A0 Z1 c+ N3 o# Q1 v" ]3 F, o
double yiDuanShuJu_LowMean[1000];
& ~0 I) s( Z/ @4 h# L4 E int ixstart;
" h8 V7 |. }" J5 Y9 Q double dv0[1000];$ T1 v) X, ~* P, Y. @$ d) n9 y
comm_AGC pAGC;
2 o) R- f9 |1 E2 n& [ comm_CarrierSynchronizer pFineFreqCompensator;. { Z. F- z# u* N
dspcodegen_FIRDecimator pRxFilter; _2 e3 P" C8 S' l$ X
comm_SymbolSynchronizer pTimingRec;
* N3 I7 o7 }5 v1 z1 `5 p comm_PreambleDetector pPrbDet;
3 d+ h0 y! [' x m3 E! {4 e7 ^6 I$ s FrameSynchronizer pFrameSync;
# D! h) v; W# U1 b' P9 \ QPSKDataDecoder pDataDecod;, }3 r- V, k; e }5 l9 l; f
static double usable_left_filtfilt[81000];5 j+ r; V3 M b% _2 l
static double youXiaoShuJu_QuZhiLiu[81000];
. S& V" R+ {1 Q6 v3 I# R double mtmp;
" I) K, F; @0 [5 }+ H; l4 ]1 i: @ int ix;
i6 G4 B/ m# M. z& x boolean_T exitg2;
; D9 p9 ^. G! A8 _1 H$ c. T$ U boolean_T exitg1;9 j, e6 j( @. {/ M6 j; s7 q+ ?7 |
double YiZhenShuJu[800];% \, B) E0 [8 f7 k7 V y4 |
double dv1[800];* J; Y% j |! B5 A
, o' y( S) U9 _1 |# z8 j
/ E+ R. c% M+ c" e3 K r9 n& v# ` double b_YiZhenShuJu[800];
6 {/ e# G+ ?0 c/ \ double I_filtfilt[800];
`/ ?7 N5 A1 O: F4 S1 \3 ~3 ~ double Q_filtfilt[800];$ s/ j+ I; i0 v" \- w% y
creal_T b_I_filtfilt[800];
; q# l+ U1 R* a7 o6 J; _ creal_T b[800];( k/ v* ]1 u: F- B: J1 U$ f, R
creal_T RCRxSignal[50];
6 T3 W) @/ `' t creal_T fineCompSignal[50];5 \5 y" T& e, x1 i: n% a
double phError[50];
( ?5 j3 N8 i- w- }& t creal_T timingRecSignal_data[28];
0 D+ z% I( [& H H& x4 ` int timingRecSignal_size[1];2 ~3 O) h- b+ ]3 f4 r- u# F$ f k
double prbIdx_data[28];
: ?: W" ?% ~% V" {1 v int prbIdx_size[1];; c, g, ]! d4 q: o/ a! t
double dtMt_data[28];1 q/ M5 \6 ^( c+ Y+ G
int dtMt_size[1];5 j& u' \$ [; c+ f. a
creal_T symFrame[25];8 S: k) T$ _1 F$ o& \* s
boolean_T isFrameValid;' s+ r: E3 Z9 Z' I
double unusedU0[3];# k2 s. m$ K' m9 Q' g& N
# t, ]3 T- U" H4 P5 l+ I //调试过程中的变量/ @+ u7 ]1 a; S5 t Z6 r
int enough_data;& t2 N* K, v3 g* |$ t/ Z3 k
1 t# Y1 Z) ~) R3 r
int enoughDataFlag;1 c1 ^9 C2 j9 A, I+ {. D' e2 I+ L$ `$ |
int yiDuanShuJu_mean_int;
* t# I% t+ y: t P7 k3 u$ \ int int_sum_dv0;! K# n4 K( c* _! o# m8 g8 `' y
int oo;
; n- A9 \* l7 P1 C4 ~ int ii;- o, \. ^- |( q) r9 m: D0 t7 Y, K
myfuck=10;
3 O D/ y0 t( E7 T/ D2 A9 { /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
9 M3 E1 Z2 P; P5 Q( o /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* C; d# b2 I+ D- Y
1 T) ~2 Y E9 C yiDuanShuJu_mean = mean(data1000);
6 u" F3 n6 ]' o9 P Q& r% M$ S$ p: m; V
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
% ?/ t# q9 ]4 J UARTPutc('A');
$ b& e/ B" E: h# D8 G, `2 t UARTPutNum(yiDuanShuJu_mean_int);+ Y0 B! v& N5 H4 p9 B9 T
UARTPutc('\r');
$ c7 M2 y# Q7 g X1 j8 ? UARTPutc('\n');9 L$ @& e, H. _( l" s
. v1 ]0 @% _2 p3 z) p6 g% r: a9 F
for (ixstart = 0; ixstart < 1000; ixstart++) {' c7 T9 O1 w! e2 }
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean; ~$ ^! j$ @- J
}6 ^) i. ]9 X0 V1 B/ H5 k8 J% d
! s3 H8 u ~/ M$ r" l4 o
power(yiDuanShuJu_LowMean, dv0);, c+ C' h0 ^8 L8 A9 x+ }
. q* L) ~; ^8 m7 E, j( e9 l
int_sum_dv0 = (int) sum(dv0);1 u- q2 N8 Q! t. ^$ b
- r0 I9 F3 e- q* k% y9 {, C/ R UARTPutc('B');
& A8 g/ N( F* I UARTPutNum(int_sum_dv0);6 H m$ u7 n5 j8 Z" v
UARTPutc('\r');
& T& ^% F5 X- C9 n UARTPutc('\n');
2 L& d* t' t* j; ~( }4 J2 f, t& t' L& R6 \* |5 S+ [2 ~, j7 j: X
// int compareFlag = int_sum_dv0 > 1.0E+8;
$ X5 G: |, A$ E9 a2 @
5 T0 |; @0 e1 H0 |' \9 b if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?+ _9 J/ p+ N6 e( k0 W& ]1 Z4 R
UARTPutc('C');
3 E' y) r$ }' p5 o, ~ /* 比较信号能量 */
0 S3 b' S2 X) [* _6 J" Z) V /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */9 ?& I0 f; m+ V" A4 @, k0 _; y
// yiDuanShuJu_mean = 1000.0 * youxiao_k;3 n* \) D L# h$ o
// for (ixstart = 0; ixstart < 1000; ixstart++) {
1 x Q, @* \, |5 ^1 z// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =+ `3 E$ i. @5 T( F# T+ p( h0 p
// yiDuanShuJu_LowMean[ixstart];8 u" G4 L. S0 j& h p' B. m) Y
// }3 S, a* X# Z8 [2 z
//
) c+ }; X6 R6 t7 P% I; f// youxiao_k++;7 O5 C& _# ^5 _0 _
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==2 e5 i3 {4 O0 c' _6 S ?
// /* 感觉要取21个数,即0-20, */
1 q. O6 s0 Z9 E# [9 p1 \// enough_data = 10;//有效是10,无效是0# {* q: Z) u/ l/ h7 `
// }
9 H. e4 Q" l+ ^8 u }
4 E& J6 @+ c% m- u# Y: L' z3 m- V% W
6 w X/ x$ G! v/ d' K" j& @ enoughDataFlag = 100;
$ B% O Z5 i# o$ H enoughDataFlag = 1000;% H# P9 z, L1 q
enoughDataFlag = 0x02;! ]- q# r z* i) [% }" o
enoughDataFlag = 200;
# ~4 s0 H0 z$ K7 [# n
: [, O8 N$ o& v2 s# _, l7 c int myfuvk1; e0 k% o2 h/ z& `
myfuvk1 =11;, v% h. G+ i, }. b, n' y- l, B2 R
+ h( E. Y, L* h ]4 f+ K4 U; S4 U; ?8 j: G( |! Z* B/ g% J! ~, w- b
enough_data = 0;4 Y2 H, c+ |6 I
+ Q) o, [# e. u2 J7 w# u W$ ]// if(enough_data>50){( H) W) c3 L* R
// enoughDataFlag=0x01;2 e4 ]- J. e8 y1 ~+ N8 M3 u8 A0 F
// }else if(enough_data<50){' |, {6 @& [: P4 h8 [& R; s, G; e
// enoughDataFlag=0x00;//0x00还是不行
/ H, U# G% [0 u0 ]* ~! ?& N- b// }# Z( n* G, _( u0 x2 i. ~% U
: p$ v; @0 _! Y' w2 D- ^" v) f9 M4 D+ U4 w5 x. [: j; u
oo=10;! P- D" s/ V9 z; o3 H+ u; s8 L
oo = oo < 5;, [% u$ H4 M3 @1 C: P+ k, y
if(oo){
" W; M/ G) f$ v+ F2 w ii=0;
3 G7 n _% U$ s7 Q2 D% v }
0 p8 a1 X: L. O2 a ^) ^ if(oo < 5){
; w$ z" X0 [' V" f ii=0;' ~ L5 C1 X' n* [2 x! O! X2 W
}
) ]4 C3 `0 F% l& h1 _. M, O- k if(oo > 5){: b$ R6 m0 X& y+ @" }
ii=0;1 n2 o% P* u' o; w" @: J: ~
}6 \7 V$ I9 B4 ~' r u+ J* ]
' R7 |+ l) r* { /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
4 s$ l! ~7 Q" m$ l' s- [( N /* 如果数据足够才执行主程序 */3 X% ?& Z- H& p% [, g0 d7 a. R
oo = oo < 5;2 r. `2 x N2 x
enoughDataFlag = enoughDataFlag < 5;
1 r" U ~- \: q- `: g- W6 f( k% q if (enoughDataFlag < 5) {
# i. U, c5 w! k1 O5 i; v: P2 h// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是00 K- S- f# v% v! Q
AGC_AGC(&pAGC);( b! V& d! `$ m8 L! V% K
6 I" _5 j& T( c8 s9 F c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
5 X$ g+ J# ?( J0 H6 z3 V" q FIRDecimator_FIRDecimator(&pRxFilter);/ A5 ] s5 A; c8 t$ y: ]
: U8 l' g- I/ M8 I% }# V& T+ ~ /* Downsampling */
, x' X; k' {- q; P4 s5 p c_SymbolSynchronizer_SymbolSync(&pTimingRec);+ W1 H# w, `! `- A* S$ y
0 g" o& w) E# \" {% u! B* @! Q c_PreambleDetector_PreambleDete(&pPrbDet);# w" ^5 |9 J1 t3 I
0 z$ Z8 e2 a; _% J9 n0 b /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
0 F7 @! W: w2 m' L9 D. M /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
0 f* D1 X( m+ L /* %帧数量=100 */' f# z7 _+ |& h L: o; p
pFrameSync.isInitialized = 0;
$ t! ]0 g0 R5 j9 s1 q, N f* O& u! H7 M! J# A5 P- Z
/* [EOF] */2 E% o* b7 s" k% J0 i
/* 前导码长度是13 */
K6 ~4 x: l: Q/ z& v% J /* %qpsk */9 j I: }+ Y2 S; }0 j" E, j R7 G
pDataDecod.isInitialized = 0;( a) i* e$ d8 L1 ]
& s0 Z( m1 `7 m8 J
/* end */$ e5 u6 H! \ w: B7 l
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */6 ~# g) e6 t$ `# K O4 u V
/* Convert 3-dB frequency */
8 q- s' [- @, \% G l3 r /* Convert 3-dB frequency */
3 W1 j' C2 T0 _" q+ J# q5 G7 f* t filtfilt(save_buffer, usable_left_filtfilt);
/ S- e3 n7 g/ w- X# a# j for (ixstart = 0; ixstart < 81000; ixstart++) {- l1 z, @& S8 O% S
usable_left_filtfilt[ixstart] *= 2.0;( t) Z7 i+ Z1 _6 j( u. i
}9 ^5 g$ m+ G, S# W" I5 S9 `8 R
+ c/ @' }9 | y2 j /* 注意乘2,处理幅度 */) c- m/ O/ T) Z
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
: O2 [' S" J( a# D /* %% 行列转换 */4 p! s% Z0 H# p) z9 e! Z+ N) O
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
8 K# a3 a! ~2 F7 e( w' N7 W! m. d8 ? for (ixstart = 0; ixstart < 81000; ixstart++) {+ ~2 N0 p/ x6 T) d
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
Q6 d+ L2 S8 \2 k2 ~ - yiDuanShuJu_mean;* V* v# e1 R8 a7 `: T! g* m2 A
}
9 W9 f- z1 l* S" h# t8 A/ _, z$ Z4 w8 c) ?/ ?
/* %% 应该对数据归一化,但是这一步放在哪比较好 */: S* w9 }6 k1 `
ixstart = 1;0 q# w( {) H! N! \6 m, W) |
mtmp = youXiaoShuJu_QuZhiLiu[0];
1 _6 Y+ x' S2 C% j" ` if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {9 d9 O& B; i% C) p, D
ix = 2;" g& s1 c+ v1 O
exitg2 = false;
! w* H0 ~6 S# E' N g0 v while ((!exitg2) && (ix < 81001)) {" t4 n) X5 d+ C8 B" i
ixstart = ix;; i# T% j! p0 F) a1 ~& o
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {4 ^9 `( T2 ?2 Y: \6 i4 Y
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
5 o! H9 @ S) I3 ]6 u8 {& N exitg2 = true;
7 H3 J& y4 N8 f5 o/ s# s0 D+ K } else {2 u4 O+ J5 n7 a9 n' A( @
ix++;
( l& u+ z) v! @# Q) X# s }6 I8 L8 P, R4 h( J9 \- [! E
}
$ \/ ?! R; B- |1 ~ }' f- Z9 ~8 A/ P% R( W a( |+ h% b8 u
0 k9 n5 A& n3 n# y. O9 @- D
if (ixstart < 81000) {
) _% [0 \1 u8 j+ W while (ixstart + 1 < 81001) {
1 p. |% Y" v* Q' l if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
3 U# y# Y6 c) [8 W mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
8 ^4 ?( p3 |. i& d' i, r z1 e }
5 g6 v8 W" d) f* F3 F. {+ f
, [+ `: F8 E3 s' ? ixstart++;' Z. l5 D; k+ e& }( e2 l/ ]
}$ S; m5 M1 V( ?' \
}& Z% ^0 L& |5 ^ v
' G) v# u' s, A( j& k
ixstart = 1;
+ n8 y$ c& C! N9 I yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
; \1 k i3 r: G( `: v6 s1 ` if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {, }# C) B o* a+ r5 H3 ]# q9 I
ix = 2;1 j8 O) q( W( b0 _
exitg1 = false;
9 G4 J5 c$ W' V' j9 W. U( g while ((!exitg1) && (ix < 81001)) {: O2 x6 |0 N- e2 I! f2 g# R# _
ixstart = ix;9 g% i( N3 [7 h' ~
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 H- ?- j8 [ Y7 y% K$ c" b7 _2 @) K' ~
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
& l. N2 p/ n9 m! R# D3 K exitg1 = true; R6 e! z+ [7 R
} else {! \, p4 `& x5 z2 m+ C. X ]8 P+ O: h
ix++;! @9 W& m/ z# o% C
}
$ H$ s! H' a7 ^+ \% k }1 O% l3 n: _$ o. D* D% {+ ?
}
1 b' k: Z1 b0 M6 O3 p) X% L5 {1 y; h M3 q
if (ixstart < 81000) {
9 U8 u7 g2 N0 e* J9 D# E! V* G while (ixstart + 1 < 81001) {! D1 B6 M/ F5 P1 U$ P5 t& r/ w5 \. B
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {2 h4 ~" A" Q s; s
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
/ x* U2 Y4 Z' ^. f& x; N }
) @3 P+ q: R+ J0 ]8 d5 N8 U, K0 W5 R
9 M9 e$ t1 D% T2 k4 g, b% a/ k' H ixstart++;/ a4 z4 z* Y3 c5 ~5 j2 k8 [2 s
}% ?* y& v6 S4 j4 ~: `3 Q
}! m0 |: G# e6 u: ~
$ o( k9 g' l9 e9 k- a! R yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);# d/ P _" j- x" L# J |
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {1 I2 X, A0 t, g6 J4 ~7 ?7 d
yiDuanShuJu_mean = mtmp;& A* I% D" k% \& |7 b& N
}
. D9 b5 i& o! F8 x8 m* {5 s2 Y
. x9 i% _* M$ I0 r$ L& Z /* 找出极值 */& j4 n+ d9 [: R$ j. u9 T/ d% z1 s$ P1 O
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 {% X4 b0 B/ f) F8 J$ Q( ?. f youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
8 d4 k) ^/ |/ [$ G }
( u( j: j: |; s: w. y9 D$ j
; {3 p# ?& J) @- O --------------帖子字数限制------------------
+ Q3 G# L2 F/ |! a6 ?}& U/ D9 R4 ~+ M0 Y5 _( m
! t# [3 Z( e) b4 F+ l5 u7 J# j s+ Z( M: T: q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|