|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , I6 q3 i) w8 L7 E* r5 Y
g, E5 f& N. q各位大神:
( d) p3 e; L$ V/ C6 r b 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
. c( R( ]$ p1 K 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
% i5 M- w3 p3 }9 [. u1 x5 r' V+ [! z* E0 S
% A& L! x; }2 S# w2 C, A这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。7 D5 u, K4 x! s1 C4 y
6 @' Z- b9 w4 K4 ^( b并没有其他线程
2 X! ?, g3 {. @* v反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
9 I/ W" e1 E/ D0 I也说不定是和堆栈有关系。。。。。。
, Q: k% X* O& C; @ h2 G请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....& G1 ?- w+ X/ h0 C0 ?
. k' o# y3 a1 y- L% f) y0 `0 {
( b8 m5 F$ }: r7 L) E8 L# l/ P6 n: ~9 b8 \4 e& l
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
! n7 d5 _; p! W/ {
% C4 A$ k* ^; \; ]5 I. y$ ?6 Q4 s& Z- C/ a4 u# g& z: j
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; h) L2 c0 K9 G/ a3 a0 W
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
9 v/ s, e' M+ p
) ?- r, c, }" ?1 L) F0 tboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC( q- ]& H5 f6 I. }, S X
const double data1000[1000]) {
; Y, I6 l! L& u" l. J' Z. [
. Z/ z# q/ j! V- v4 r0 S; K# D R0 i int myfuck;
/ k4 o1 o( y% t double yiDuanShuJu_mean;; Q/ N* o# B& j- }* P1 u q
double yiDuanShuJu_LowMean[1000];
- V3 |2 ~, M. n4 _) ^ int ixstart;
# l# X3 Y1 Z% @& G q7 t( a6 I double dv0[1000];1 C3 R4 N' _5 k2 H& p+ W
comm_AGC pAGC;* ]6 O3 N( [3 w( {6 t
comm_CarrierSynchronizer pFineFreqCompensator;- W) O* p' J5 z) ?+ k
dspcodegen_FIRDecimator pRxFilter;
0 d3 S/ D$ m1 d comm_SymbolSynchronizer pTimingRec;
" \! b2 }7 n- K7 D# |- C; ^ comm_PreambleDetector pPrbDet;! w/ \, Q- D0 J$ G- E& k
FrameSynchronizer pFrameSync;% k7 T; O0 `: i0 v9 d& a
QPSKDataDecoder pDataDecod;
# T% M) Y6 ^5 B6 f* a static double usable_left_filtfilt[81000];- y5 _# U1 x X% G+ t3 F
static double youXiaoShuJu_QuZhiLiu[81000];
5 a0 x% T, }/ y( j2 t double mtmp;
4 [2 j1 o- U! f, A+ q: { int ix;9 P! E$ T( q) h9 h( Y7 ^- ]
boolean_T exitg2;
3 | ]7 C( A% m% Y boolean_T exitg1;
& \; }6 W6 k2 n- L9 Y M double YiZhenShuJu[800];
$ ?+ q* {% v g$ C) C) h3 u' ]/ k( b double dv1[800];
, k. w8 Z8 O% O+ A& @
" _$ e+ m' `1 }$ w, L1 O! w5 o; E4 X+ P3 G% v9 M/ w% \. A
double b_YiZhenShuJu[800];$ j8 g* e' {2 r* `
double I_filtfilt[800];
$ A: i" Q8 J- R5 O0 b double Q_filtfilt[800];# q- L; O% t6 i8 p+ w6 ?, w
creal_T b_I_filtfilt[800];
' M* [3 h7 p; M creal_T b[800];/ Q1 u o2 I c1 U+ `2 D4 k8 m
creal_T RCRxSignal[50];
% w: ?' B8 k( T" G: ^! ]+ D7 J creal_T fineCompSignal[50];; p" S! W& M8 U- H, |2 N
double phError[50];" S7 B4 j J% h# G5 w2 X
creal_T timingRecSignal_data[28];' b: f: Q3 e* W( T6 i
int timingRecSignal_size[1];1 A5 L9 ~& f4 ~5 N" t7 g# p
double prbIdx_data[28];7 E; u& z' ~. ?7 t" M" R k
int prbIdx_size[1];, F0 `$ {, p) E9 ~
double dtMt_data[28];
% F) w( _$ e, b int dtMt_size[1];
8 s/ ^0 L4 A& ~ creal_T symFrame[25];
' O9 R& l0 R6 f5 ~4 d boolean_T isFrameValid; X8 T2 s3 k& b: |; W+ f
double unusedU0[3];; d6 K; T) T' o4 R2 n
P! c3 [/ ]& M# f: [5 J //调试过程中的变量- z( h% q( b9 K2 D
int enough_data;; A5 i% O$ |6 W
9 t& v; t* q* \( v* f5 E
int enoughDataFlag;
5 u% {/ O: t( H0 ? int yiDuanShuJu_mean_int;% A" l6 D# n' N! J" k
int int_sum_dv0;
' G- y. \" I& y: ^( D! p int oo;
* Z; o/ c0 T2 `2 p5 l2 N3 w1 p6 H int ii;, t% y' X9 P6 U% Q: |& m! L
myfuck=10;
# `4 n6 n. p) O# i1 S3 i /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
) j4 h* R- U; o0 N& t+ q' W /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */5 Z: u7 i9 O7 O: i$ a7 R+ D1 }6 |
/ Z3 x/ S* t* \- G4 T
yiDuanShuJu_mean = mean(data1000);- u4 D/ p# A( {0 R
1 z8 f$ B3 S4 b2 A. J2 Y5 J
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
. a; ]- U2 s8 P+ g UARTPutc('A'); M- S$ G, e& b: y' S: z
UARTPutNum(yiDuanShuJu_mean_int);5 N5 m1 W& {3 @2 ^, m
UARTPutc('\r');
% n2 B e8 ~! E' R) |0 l UARTPutc('\n');
) F. }$ x. E# Y2 e1 {2 {: x* J; n3 b8 G
9 f& O3 r; Q' {8 r3 F for (ixstart = 0; ixstart < 1000; ixstart++) {2 R# y3 p# Y# t+ n' D
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
+ F1 e" e: W6 e1 W& K3 W5 c }
7 c! A) t% A% O9 k/ G4 k* P" @; r1 R1 j S E" `: o
power(yiDuanShuJu_LowMean, dv0);3 [& W0 _9 n4 y! E4 [# q7 J+ a5 L) k
: R6 ]- c6 R* ]: l$ V- O5 y
int_sum_dv0 = (int) sum(dv0);
. H7 F6 U/ b' a V( m
- @& w M! n: z% m4 j# ] UARTPutc('B');' g. I6 l/ K( x; s
UARTPutNum(int_sum_dv0);
1 n4 N9 o4 M' | UARTPutc('\r');
4 j' {$ k D5 n4 G8 u UARTPutc('\n'); n! \; n! a% [+ k) |
. m @' @' e5 T. w6 X2 _
// int compareFlag = int_sum_dv0 > 1.0E+8;
; v3 [- r: M+ T2 O8 N P
+ c6 k$ k/ @! t% } |% d1 `% ~4 z if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
" G2 }; n. H8 t UARTPutc('C');* [+ o% {) L. h% Y% P. Z
/* 比较信号能量 */
5 w& Q; _# b/ Z2 T2 U }* r z' a /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
8 r' Z/ o' e1 o$ x& H7 \/ m1 Y& A2 R$ U// yiDuanShuJu_mean = 1000.0 * youxiao_k;* f B6 O6 {; K% S# I7 @# d
// for (ixstart = 0; ixstart < 1000; ixstart++) { E, ?; \2 J2 { x* @
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =3 u8 r& X, B' r( v) P# b5 B
// yiDuanShuJu_LowMean[ixstart];
0 {( c. s/ b) k' e4 B7 }// }
2 b: E' p7 T+ Y% ~$ V5 h//! s5 n! i' S$ h0 \! O
// youxiao_k++;
/ A4 i. H. Q- d// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==/ K5 I' {' r" p& P M: o
// /* 感觉要取21个数,即0-20, */
2 K' [& w* g: g3 b/ h! j* \// enough_data = 10;//有效是10,无效是0
6 M# A. f! v& h( Y& w// }
* o9 a4 Z! S. c+ w( | }5 \7 w" B9 c+ f+ h& \' e \
+ h3 M" E0 l+ J: v6 K* _3 x
1 b+ s0 \% P* H8 b- f
enoughDataFlag = 100;! s W$ S3 ]6 C: c
enoughDataFlag = 1000;1 J5 ?- ?# w5 b- Y- W3 ^
enoughDataFlag = 0x02;5 m0 G4 ?. i* T6 e4 T
enoughDataFlag = 200;) k9 h+ D0 |$ D, b7 J- ^0 w
9 u& X; s! F8 P' F* j0 S
int myfuvk1;) Q$ x1 \" R! e0 c
myfuvk1 =11;0 x& e d/ p' k4 \" o6 s+ k& s
3 q- B. {5 W. e/ v
% [" a: w1 J$ J; m* m, I enough_data = 0;
; i0 c o" m1 v u+ @+ h3 O. U, i1 Y8 z* \
// if(enough_data>50){1 D& c& f6 X8 ]( S
// enoughDataFlag=0x01;7 P" `1 Q# s3 S* z, k5 q0 ^. m
// }else if(enough_data<50){+ `0 A1 A5 c9 ]( [7 i
// enoughDataFlag=0x00;//0x00还是不行
9 w" h! J; u. ~6 B& g- j// }
& Y9 b( K$ P7 u( _9 t4 _+ u9 u3 t
* I4 Z" e/ L% g0 v i
# h9 O* w% s" s4 d0 n- O oo=10;" K; P" l1 z* g% o5 f* I& B
oo = oo < 5;
0 m q6 w. n; {; ?* I if(oo){
" \( u& n, y3 g7 S' S6 X ii=0;
) x( W' G0 K/ g! V5 R! h }# s) W# E, j8 Q7 b" U& I7 `
if(oo < 5){
! D* w9 u9 ?" v: _0 X ii=0;
6 O% @( d5 m p( [ }$ B9 Q. ~( O8 l. m6 X, m
if(oo > 5){
& @* u4 E/ A" X" \ ii=0;
- F2 o) T; k9 u3 u }
; f6 |6 }& l, W- ]% _8 N7 G- f: _9 _: E- _9 v
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */. E9 w: C* f. |! S2 {5 I& e
/* 如果数据足够才执行主程序 */4 d* s! `8 ~* w, P; ~; W
oo = oo < 5;* Y; | p. o# S" r+ Y* t" }
enoughDataFlag = enoughDataFlag < 5;0 J. L4 N& ~6 U) S
if (enoughDataFlag < 5) {% p' {' F4 A* d, i
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0" c% ^/ y) ^7 M5 S9 L
AGC_AGC(&pAGC);$ [8 j: [* G8 [, r0 N) D3 a) V
) \) q$ z$ p, J @
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
7 ?1 t. A: ?2 w( I9 u FIRDecimator_FIRDecimator(&pRxFilter);
" n6 d6 \5 S" s; {! i9 h- V" [
4 Z1 u; s$ I1 R* K- j0 H# a* E2 p /* Downsampling */
3 o G8 d; o. l0 t$ t c_SymbolSynchronizer_SymbolSync(&pTimingRec);
" w* @" Z) ?- \# n/ g1 n6 G4 f8 g6 W a( a: S3 e1 M5 K
c_PreambleDetector_PreambleDete(&pPrbDet);4 R J& F8 e, z4 p
2 _- T. B& m0 F7 ]* P; g/ [+ Y( ?# O8 [
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
0 N) C9 B- l4 E' Y4 N/ O6 \ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */" F; @4 e* H( U5 }0 o/ \; j5 M" d
/* %帧数量=100 */4 _% ?2 o, g8 v% L6 }! U' K( _, Z
pFrameSync.isInitialized = 0;
5 I& }& O' J5 o+ G/ w- ], x* x. x- F. |. a- W* ]& g) O
/* [EOF] */5 A0 e- x! g7 X$ l
/* 前导码长度是13 */9 V! } `# J5 d+ m# G O
/* %qpsk */2 v, W7 s4 Y) y/ X0 s# w$ ?( @5 r
pDataDecod.isInitialized = 0;) C6 n% V2 ~0 U$ V4 B, @
; O/ a4 \+ m: n7 ]% @, y
/* end */: x) R+ p1 O( s M# {+ N7 Y" C
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
$ E2 k% F. o, d3 @/ d /* Convert 3-dB frequency */
" s/ @2 ?- f( g) e0 l /* Convert 3-dB frequency *// @8 y7 i% E) {: B" y& H. G+ f
filtfilt(save_buffer, usable_left_filtfilt);
4 P* R; S$ D$ j9 z s for (ixstart = 0; ixstart < 81000; ixstart++) {
3 T6 D# B. z% q+ y, I: b1 j usable_left_filtfilt[ixstart] *= 2.0;
: X7 R. {; @: _; x3 j }
; ]4 P# @% _1 o( |1 r/ G! T( e- L- z. p/ J
/* 注意乘2,处理幅度 */
- v/ }, d3 x( U/ L" d9 _ N5 `: S7 l /* %% 我发现带通之后其实就均值为0了,不用这一步了 */ n$ f$ \) L# y2 [5 J
/* %% 行列转换 */8 I R6 J$ c5 o& w
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
& G/ k: g p& x+ u' r for (ixstart = 0; ixstart < 81000; ixstart++) {3 `* b0 D" i1 H* y
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]/ p8 \8 h9 @1 |' A9 G
- yiDuanShuJu_mean;& f# _$ Y* k: ^3 l
}
# P. F5 S* O V* V! W2 A
' ?2 y, ~% D- }' u' @$ q$ p; ? /* %% 应该对数据归一化,但是这一步放在哪比较好 *// ~. d8 E D- w' V2 s
ixstart = 1;
! h2 |& Q# e9 q( H mtmp = youXiaoShuJu_QuZhiLiu[0];
, W5 ^0 h" W! w, C if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) { Y+ i0 }0 y" A) \# b* L4 i1 k
ix = 2;9 n# J9 o& V$ m) W7 v
exitg2 = false;* x" H2 h& b) H5 R* i+ h
while ((!exitg2) && (ix < 81001)) {
! ?6 W. W! F7 m- I: u% K$ V6 B ixstart = ix;
! F; R, K) Z, [( y, T5 C if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ ?3 Y- o$ b" R. U9 k" ~; e G- b
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# q$ U4 p) c9 T# }
exitg2 = true;/ F0 X. z9 \" k8 {% U
} else {0 y( L7 _+ M1 C6 [4 j0 }1 k
ix++;4 C9 o, @. o% x( f+ e
}* Y$ t( u# i; f y6 @( i
}8 x5 @& v, c7 F6 R
}
1 V0 \9 v; A' R0 n9 \
" _7 _3 C0 h ]& ~ if (ixstart < 81000) {
3 a/ `% i0 O+ o& P0 q+ [ while (ixstart + 1 < 81001) {0 q9 l1 y; H$ k- b- Q
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
4 n9 N0 c% P7 L6 C mtmp = youXiaoShuJu_QuZhiLiu[ixstart];1 g( E: v( w5 t0 f# W: A' X4 f
}
& y% ~9 ?: p I& r9 N% M0 ]0 d4 _$ }% F* W; w+ D$ C
ixstart++;+ F4 `. u" M6 }" M) z& i6 y
}
7 X; r2 B; n& _! z5 v }' ?/ P2 u a. ^2 _) t$ ]
0 l5 r, x2 q0 b6 p; q7 y
ixstart = 1;
( @, d8 C/ Z5 J4 \$ S yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];# H- _1 [7 }+ b/ A0 \$ d! S. j4 ]) a
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {3 ]; P \6 n+ O2 f% l* B
ix = 2;
* J+ q [ H) p+ v exitg1 = false;
, Y: j6 b* _7 Y- X6 v( X2 P while ((!exitg1) && (ix < 81001)) {
1 H8 y; @0 p/ ^7 k ] ixstart = ix;
! c% ~; e6 ?6 ?6 @0 P" c" @ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {! Y8 [3 |3 u# S, {1 d% p
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 U) |: d% u: i0 ?
exitg1 = true;7 h! l& j- j f9 u3 |0 _! j
} else {
' y$ `+ `8 S; w$ I( s ix++;; h- E$ s: K8 }; H+ }( }
}
) K5 q2 h4 Y# g9 i$ f }( A5 m6 A. O3 V; T; V7 o+ m. @
}
. \) {) N1 R: {* j$ E: ~; b, v' V* `3 [
if (ixstart < 81000) {5 W7 E2 J$ d5 |/ C; G t
while (ixstart + 1 < 81001) {
3 Q9 x+ V, B& ~4 z. s: S0 R3 E if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
* e7 c6 L7 [; G- ?9 T7 g yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
% _0 m0 x/ t+ W }
; }- O: ^+ N4 Y( K q2 z% @+ b$ Y- N
ixstart++;! n! ^! g9 B% `* Q ^( T5 }1 g3 e
}" q$ |4 q g; H3 [( f X
}' U( l4 ], ?& ]
9 k5 M7 J, j) Z" L1 J5 f e" k# v
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
5 J. Z( g2 w' ]' B8 P# e$ s if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
5 o ~& T) t0 \/ n& R yiDuanShuJu_mean = mtmp;
, L6 _/ {' r& Z+ I* R9 M, X6 ?) j$ p6 d }
$ G1 {0 j* s. [; ]& A5 I ^6 G' U5 ^; f) t$ O
/* 找出极值 */
8 h0 b. ?% }7 p/ R6 s for (ixstart = 0; ixstart < 81000; ixstart++) {+ n9 z5 y7 \! ^ q
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;9 U! o& M2 ^4 X) |/ Y7 ?2 n
}
1 n, Y: H: j5 A8 `" r2 k) A/ q7 L2 s7 m6 {
--------------帖子字数限制------------------1 v4 N1 }. z( S" l
}5 A9 T5 b' e4 q) M p- k
1 N% p8 N% L5 B5 e
3 k, ~7 y$ ~+ @& m' V R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|