|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
7 S/ u" I" N5 e) ^' J: Q
/ P7 m0 I4 D6 i, K1 A0 ^) c& R各位大神:# J4 e2 n; ?5 ?" v# p) e
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)9 C8 y- L% Y1 `0 w6 @$ J& N
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:$ N, _8 s2 H5 f" g
% z% l+ {: t% \$ J1 T8 T* i
4 B7 Y- @% J+ ^& M; q6 u6 u* r这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。 q3 q, J; b8 k5 d" r! {
# K' k& b: O& A" x5 q并没有其他线程 \! ?5 O( I" A$ s6 d
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。! i3 {( }" n! e. s. Z1 ]
也说不定是和堆栈有关系。。。。。。
- o& F1 i4 I Q" Y请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
, F+ h, C5 k; M3 t
! H/ _/ t/ b# m+ c5 g( r) y6 E8 p+ I
- e& {# c8 }% s我也很绝望啊,希望大神能帮帮忙,感激不尽,!
4 m+ a6 g: R5 M, {& Q7 d
% c5 s, X) @% ]+ \8 m
' ]- S8 A9 c T [附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];. q" S& H5 J$ ~2 s5 k! D/ a
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
- `# w' \0 Y) o" ^" b* V" A, \
! M! x( J8 s, V: j9 ]boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(4 C2 ~% q2 z+ ^
const double data1000[1000]) {
f+ P* x5 a! @$ J9 o+ S. s `3 e1 F, m1 k) z/ |
int myfuck;
3 o+ E4 R( v+ K1 M double yiDuanShuJu_mean;
. o# {, W# O0 D2 Y( b double yiDuanShuJu_LowMean[1000];
: w; Y; l" W8 c) i int ixstart;
5 F, m, I% ]- @- _' H1 y6 @" B: Y double dv0[1000];
0 o2 A' i1 t4 j( E4 n5 [3 m comm_AGC pAGC;' r& z# H/ ~5 {. V4 e
comm_CarrierSynchronizer pFineFreqCompensator;
& `. |1 y8 C }3 S0 o2 `- n dspcodegen_FIRDecimator pRxFilter;' G$ p" X) }* t; a3 J
comm_SymbolSynchronizer pTimingRec;0 I I1 }' k5 g* O1 I
comm_PreambleDetector pPrbDet;( H8 N, _' U9 W8 D" Z5 f' J
FrameSynchronizer pFrameSync;! u* b Z1 s; L5 [ e
QPSKDataDecoder pDataDecod;
" r- x7 J3 B8 D3 H# h; K3 ?" g static double usable_left_filtfilt[81000];
7 s9 L* Y- ?3 |. G3 A/ H1 \: } static double youXiaoShuJu_QuZhiLiu[81000];) O; h+ T$ R q
double mtmp;
. E3 j& `3 V6 j. ^" j0 G int ix;
9 K6 h7 H* Z/ ^' b( s3 Y, s4 t0 v, p boolean_T exitg2;
. x0 x3 [2 ^0 u0 X1 I boolean_T exitg1;" g8 C/ k4 [- V4 u) U: r5 Y
double YiZhenShuJu[800];
8 U9 `2 o0 v9 O double dv1[800];9 a) W$ ?$ L; D) M
/ ?* a; D B" W* G, U, X: j
5 A2 B3 s/ B1 U/ x, l% D double b_YiZhenShuJu[800];
6 O/ ~8 z7 i) K' O double I_filtfilt[800];8 b2 u, P6 j8 w9 @
double Q_filtfilt[800];
, q% X* I' l" F5 ]- b2 x creal_T b_I_filtfilt[800];
7 N( X+ o, _; ]9 v0 I( R creal_T b[800];+ G7 [3 ~$ U# t# R, |) E3 F0 V' `
creal_T RCRxSignal[50];
" v- I9 J: v8 }& e creal_T fineCompSignal[50];
# y6 E9 I0 }9 G! H# d' }8 y double phError[50];( X' Z/ _3 }0 m2 N
creal_T timingRecSignal_data[28];
# k' Z: O+ Q% P! D1 B g int timingRecSignal_size[1];
& ~- u2 X( C" M y, N. [ double prbIdx_data[28];! P5 w& ^# c/ n/ G7 ^% R# m9 r
int prbIdx_size[1];
) @* L6 W6 A& Z3 B9 o; b double dtMt_data[28];
3 b4 X. W+ p1 E, ~: G$ S int dtMt_size[1];5 @( P, O, A. [; G8 c/ O0 j
creal_T symFrame[25];0 C' k9 ]3 ?& ?% h
boolean_T isFrameValid;. h1 J% }+ q3 Q, \/ H4 y. g
double unusedU0[3];0 c7 v+ Z8 Y( L
( \* q7 i. r' M' D
//调试过程中的变量
5 ?5 Z: v1 {7 Q% I% i" c7 { int enough_data;" X$ U$ x. Y: R4 h" g5 I0 o
& F2 s) |3 j6 t5 U int enoughDataFlag;% b0 F: I" A5 {
int yiDuanShuJu_mean_int;( B( g5 h6 S+ g# O
int int_sum_dv0;0 K7 c! [7 B. z. i/ X
int oo;! F9 {2 {# x2 H: @: }) V
int ii;' o9 F& D% a6 X/ e
myfuck=10;
$ W6 _. `9 o- q' e7 {' M' g /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */* s$ h) Z. `, X9 [# S
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
& q; f6 r: x9 f( L
4 Y: c/ v. u+ O) s/ U4 Q yiDuanShuJu_mean = mean(data1000);- |, X, J$ x- U, N* v
a- H) p- A4 } w: G' ~0 Y
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
+ ^ C) P) j. {" k$ C UARTPutc('A');' ~: E. B# n0 [! |* a1 _
UARTPutNum(yiDuanShuJu_mean_int);1 M/ U0 R7 a0 d4 T
UARTPutc('\r');
1 O" [5 {+ [7 l/ b/ H UARTPutc('\n');/ X' K& i6 o( y
u. `+ l, s# _" w* |5 w8 V3 f
for (ixstart = 0; ixstart < 1000; ixstart++) {
& f+ ^0 [, w3 ~( Y$ L; u yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;0 X( U6 [5 T1 ?# V" M
}
! s: f9 j3 `/ ~' j
# \/ {! _' [5 K/ z0 I A0 _ power(yiDuanShuJu_LowMean, dv0);
. i, {5 }. G5 c; n! @. a
1 o6 Y$ V: R$ J int_sum_dv0 = (int) sum(dv0);4 z8 j( I' | L
, H9 Y: [* w( E: |
UARTPutc('B');
5 P9 ~* P v: J" w [ UARTPutNum(int_sum_dv0);1 k3 @8 Z- O5 T# Y4 C
UARTPutc('\r');. W7 f5 i9 o7 x' v" }: ^, }! \! Z
UARTPutc('\n');
" z! b0 }! Z; W8 d0 ]
. _9 q+ W. h: [% z// int compareFlag = int_sum_dv0 > 1.0E+8;# E7 T4 `% w( D
# Y! p( B. l) {" i3 P8 P if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?/ d. N5 f# v% |3 f/ @4 S/ K
UARTPutc('C');+ x- Y6 {# r( [9 H) [* z: A/ Q
/* 比较信号能量 */
# x5 |; Y' ]6 k) R2 U' W' S% C /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
. t% g5 k+ ~5 V: }% c% i( K// yiDuanShuJu_mean = 1000.0 * youxiao_k;
7 _6 A2 t8 r8 d* c// for (ixstart = 0; ixstart < 1000; ixstart++) {1 f5 @. ]1 M* {. E& f
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =5 C$ q8 i8 s' o( o: b; X' n
// yiDuanShuJu_LowMean[ixstart];! @, x. {1 @; f, X. ` t( V2 z4 v
// }
$ R. G0 W1 H; D//
, P8 }& z; ]- u; U: d* L5 s. ^% Q// youxiao_k++;
) O+ i7 I# [' O: `( ?7 h) @. Q// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
9 [6 x8 t: s- G* l% V+ W% e" F. u// /* 感觉要取21个数,即0-20, */# f4 J, T7 ^0 o& \
// enough_data = 10;//有效是10,无效是01 q, J3 J2 {, g# g/ {( W4 I
// }: N" A- p2 s$ J/ ]) L. M% [; s8 n
}# z) C ~& |& @3 I3 M! x) w o
) h2 U4 O' m- B& y" N- {1 p G' b
! N7 [/ V3 P5 m7 g/ F1 \7 W enoughDataFlag = 100;! [8 U6 N/ b; b l( B8 \0 D- h
enoughDataFlag = 1000;9 G( z) M T6 p2 s& A
enoughDataFlag = 0x02;
2 A. q6 l9 d! u1 e, K/ n enoughDataFlag = 200;; e2 }+ X8 n4 Q- y* ^8 K- a
* x4 S5 a0 R* `7 h9 ~
int myfuvk1;6 B1 c' g/ S, E
myfuvk1 =11;
& ]3 v) E- f" d7 W' F% p
" G# T- G: k1 @0 E) u+ R f+ l
; W8 U, u3 W; {4 y$ J enough_data = 0;4 z: a( B! p) v+ M; N4 O3 C& U
3 _* S% F% `4 \. z7 M
// if(enough_data>50){
' x* A; p4 s7 }% E// enoughDataFlag=0x01;3 m( v( r) S) n
// }else if(enough_data<50){8 h$ I; Y# }/ V b7 J* A, c
// enoughDataFlag=0x00;//0x00还是不行
3 @# }) {* u4 X// }
+ ~' S6 ?0 i1 P
0 S, f7 X9 ]* S( T$ c
9 }5 D4 |6 B0 b# Z oo=10;
: M1 r$ g) }" x; R oo = oo < 5;
- C( v. K& y$ b& j/ k# E: f if(oo){# r4 {3 ^% Q& H/ y0 b. m! n
ii=0;3 o9 M6 K7 _) Y9 n N1 ]
}
3 w6 ~. {/ P4 a4 u if(oo < 5){/ v, h, F0 K# N- [5 e5 E
ii=0;
; n: w4 M# w8 S# Z$ m }
9 L. o) {, a6 u% c& N0 M, O: { if(oo > 5){" N( Q) Z: r/ |% Y9 N0 a- s# _$ }5 I% H
ii=0;5 z. M& M+ z* J$ j
}( K' C5 M% G* N' {2 A8 j6 r
2 {" h5 u% g- r# Z9 P9 b; d* ?
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
' @0 }3 E; ~0 R9 ]- s) C3 R /* 如果数据足够才执行主程序 */. B2 a% y/ Z+ i* q
oo = oo < 5;
' }' r* j, r( l enoughDataFlag = enoughDataFlag < 5;
& Z% T' I: t3 N8 c, g if (enoughDataFlag < 5) {4 e) M: H0 u7 K$ X4 }6 c T0 M2 @6 ~
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是01 Q" L% G0 u6 E4 S, q5 l
AGC_AGC(&pAGC);; B7 d1 _+ c/ R* g" U9 _ F; n+ @
8 i3 \& V, x6 j R3 [- ?
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);8 I9 n0 u1 q# D, w# k
FIRDecimator_FIRDecimator(&pRxFilter);
+ m0 s" [% Z, s; `0 N1 B8 f- b5 J3 M' N
/* Downsampling */
. C$ W8 i3 [( y1 P c_SymbolSynchronizer_SymbolSync(&pTimingRec);
+ ~/ j# k8 v# X3 s- N" I" C9 C l) l8 S% Q$ h
c_PreambleDetector_PreambleDete(&pPrbDet);# ]- T3 F8 n l. }2 \1 O) g
& p9 r8 q6 p) G( H9 p /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */- d% b* b) a& V, c3 s5 J! N
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */) m* G9 G. w) j. \5 [! r t
/* %帧数量=100 */2 u; l, F( [8 h, _
pFrameSync.isInitialized = 0;
" Q4 f. W- |) ] q2 g) \9 t7 t2 ]+ `% t
/* [EOF] */$ \2 s# ?8 \4 q. |% U4 E) l; {$ Q
/* 前导码长度是13 */0 ^* M! ~$ }4 z& W1 U
/* %qpsk */9 Z2 M* h" B# \5 M
pDataDecod.isInitialized = 0;) s3 f$ F: A# Y% g
' M1 [- O3 J& C P. E /* end */
: Y2 [; |( h4 R: L) S. J {( u /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */( h4 q9 S4 n$ A+ I/ `" }, s
/* Convert 3-dB frequency */5 k$ E/ ~: w/ C3 b, V& s
/* Convert 3-dB frequency */' |$ n/ }" Y ? I8 H
filtfilt(save_buffer, usable_left_filtfilt);: p. v5 C3 C5 N6 C
for (ixstart = 0; ixstart < 81000; ixstart++) {
( J- }2 s" \8 R8 B6 b! _* d9 H usable_left_filtfilt[ixstart] *= 2.0;
9 H$ z+ [2 T* q( q1 W- R) X' q8 i" t) w }# W4 i9 _9 ]* \ n) b
- D$ h0 T( z0 h6 \9 e /* 注意乘2,处理幅度 */0 u( G4 ^9 E g) s7 t
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
) ?. h, F4 u, F /* %% 行列转换 */1 I, J! @7 x% E) U* y) @) |- Z
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
- O: g# ?4 h$ s3 z( K" S) i for (ixstart = 0; ixstart < 81000; ixstart++) {
9 v8 B1 y. Z) Z9 d9 a youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]" \# ]9 @) w: D, v1 v
- yiDuanShuJu_mean;
7 }* K/ f( p, S }
/ g7 _( j @0 S. z* A
' Y+ P- a, r6 G& w- Y% z# s" k, q /* %% 应该对数据归一化,但是这一步放在哪比较好 */4 d) [- i" r& k+ t# x; B5 W
ixstart = 1;
7 Q% o' g: S( |9 t mtmp = youXiaoShuJu_QuZhiLiu[0];
" O' I& Q+ n1 \) R8 Z if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& ~2 |3 ^. i: [* T2 E% j" Y4 W2 S
ix = 2;
* @& h8 R! P% o) M; U$ j1 S* w0 M \ exitg2 = false;- K6 g+ j6 i/ Y' d9 f6 W0 X1 O6 @ Z
while ((!exitg2) && (ix < 81001)) {
7 f' b5 D0 n3 s8 g: ] ixstart = ix;
) G) ]3 B- V7 L! P if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% b' \5 \+ ?4 ~, B
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' N% G, b' w; v1 Y! E! y exitg2 = true;# @7 b6 I, T: ]/ |0 h
} else {( l( \. T* I" J2 T: G8 A2 Q! [
ix++;: V" W$ r$ j1 {# L
}
! u7 O8 t/ l3 _4 D; @6 Z }
. v' X% ]" c* y8 p3 E }: y7 U- f* X; q
5 ^& O) ^4 R, V' \3 F" R1 |
if (ixstart < 81000) {
$ p2 U) _% ?2 P0 _* w; y$ z) ? r while (ixstart + 1 < 81001) {) e$ G8 F& ^" h, O0 r( v
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {4 O8 _$ _3 q: s) s& D% u: f, ]
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
2 M. T2 Y; S+ ]2 U" G/ T& ~ }
" E0 ?) r. i3 z+ r( ^5 |4 b5 N% K6 ^. I* [
ixstart++;
( b- c3 w- k) [# G( ?2 ~: t/ z# z }
# e3 @) }" b) i% _4 _ }
/ k" R/ A P+ z) [9 d* B, K+ z4 x, z
# R3 [# m: q3 j6 \' E# ?% C1 v/ w ixstart = 1;
0 Q9 C7 g4 o3 ^1 K f# v( E yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0]; ?5 Q9 t+ N, }; `
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# H6 |- k2 n3 V
ix = 2;# I, h. J" R% n5 W5 Q. c
exitg1 = false;! U6 s4 B" F c$ Z% u7 {( ^3 ]+ M
while ((!exitg1) && (ix < 81001)) {
! G& W R& }1 r! a ixstart = ix;- I, { }0 T# @1 z& A
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- W: \ a6 h/ P( I l
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
. g7 n) w6 R5 I1 @% \7 S) C+ k1 q exitg1 = true;
( k0 e3 d# c7 e } else {
0 u# U* a' A; J5 E- i ix++;
! s9 E# A6 C. w& C6 }4 N }8 u; s1 I9 b; K
}4 a9 N! A2 G4 |! Y. k2 Z |
}% m. {9 k( `5 f" e5 R5 a/ E
6 x3 h$ G0 i4 ]7 N4 V+ Y' v8 u
if (ixstart < 81000) {) I- C3 b& h+ W# g. ~( H5 {
while (ixstart + 1 < 81001) {6 n: S* K L+ G4 W% G o$ l4 M; a
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
: i9 E1 z) N2 G/ k1 [0 j yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];/ I6 |9 I+ ?! V0 @# `5 b! f
}
6 Y# c& l% Q) Q; v$ J2 ~6 D/ p8 V2 N+ X: h/ D# S/ ?& @8 y- O
ixstart++;
& L* q* f4 o; \4 t! t& d }
* g: M4 [( o& u }
. C( c) t. B3 X; i7 h, k
+ r6 T2 @) O3 j K c! s1 J. S; f# c7 p yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);# x) l9 ^1 }& i: H
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
6 Y; P* b# b+ ~" x yiDuanShuJu_mean = mtmp;3 y; q6 b# \/ h6 b
}' ~7 D W4 e( l, m
* V0 r# l# S; ~7 ^) l- _
/* 找出极值 */. K9 H) K& q7 m9 L- a O
for (ixstart = 0; ixstart < 81000; ixstart++) { j* C9 r% U' q0 ^% R
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
1 ]! f$ e3 o; K' ] }
5 D$ Z' X! V! q- O6 Y# C' V
1 J# d5 D3 f) L7 b --------------帖子字数限制------------------
. C3 G" y- l# A/ _+ x7 z) H0 v}
! L7 i8 T9 G- g {1 K
5 x9 S6 k5 g" o2 l+ [% v8 ^5 G
) \0 ?8 l9 A* k |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|