|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
+ v! e [% U5 y6 h& r' r* p8 X+ z i' r3 {# M0 m! t
各位大神:
, Z6 ?& T+ y1 b; k# e 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)$ Z; x. Q- v: G* Q. V
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
4 | ~+ j9 @ D y# k. p1 v; L) K" r0 ?- i9 h$ ~5 g
; F2 |, w1 g m$ @+ S; W这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。/ S2 @ d: u) w: N5 {
2 b8 {0 r# g. C$ C+ a; ~$ ]
并没有其他线程5 [- ?+ S7 }: r* [5 j% l/ w
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。6 L8 l) p. V; o. u1 m6 ]
也说不定是和堆栈有关系。。。。。。
( W9 j# Q8 H. d; `请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
/ H; j2 z! c& j( Z) c6 } t
; v9 A& ^# ?/ S
3 u, B1 c; G+ ]# S+ V
, X( }- x& d Y) ~- Q7 ~4 b- B( E# V我也很绝望啊,希望大神能帮帮忙,感激不尽,!
7 R, H. E8 @2 m! |; h2 P2 e: p! _: E6 \. I" k, X9 t
5 U1 o ^5 d% ?! X# y9 V附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
+ k6 I" V: _! y7 C: }* ?1 \ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 g9 {0 I2 c4 ~( A/ |( D b- B7 B0 _; Z; E6 |0 ?9 x
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(5 w. {0 K. W5 K: g
const double data1000[1000]) {% J( P3 T( {! ~1 E7 B# Q' M' I/ V
) ~9 @& T- T) W8 r4 \ F: L7 g int myfuck;
; Z" i- m5 {- `9 J5 N double yiDuanShuJu_mean;
0 P& |& }4 }7 R double yiDuanShuJu_LowMean[1000];
* D7 y% c! A$ E int ixstart;
% i6 _% b0 j2 t double dv0[1000];
& o' q& k$ t/ ^/ a, h0 W/ S comm_AGC pAGC;) [5 \ b* R. G) {& E- L# ?
comm_CarrierSynchronizer pFineFreqCompensator;
& p& X/ B* M) Q4 { dspcodegen_FIRDecimator pRxFilter;
) b$ s# d, W8 B, r" @ comm_SymbolSynchronizer pTimingRec;/ E: n, ~8 \* i5 B+ ]
comm_PreambleDetector pPrbDet;9 S9 o- V( @$ Q
FrameSynchronizer pFrameSync;" N Z) n# j8 I; j1 P
QPSKDataDecoder pDataDecod;
1 j9 s: a6 L" k# ] static double usable_left_filtfilt[81000];! L9 x; ^' w; J2 ?" W
static double youXiaoShuJu_QuZhiLiu[81000];
8 k2 C3 V7 o1 k8 {9 h double mtmp;
. G+ \# J* ^$ k! Q0 n. O! S' ` int ix;) n" ^! A% u A) u
boolean_T exitg2; m8 L) ], Y8 [; `6 Q
boolean_T exitg1;
: v" e* m# J, {+ n0 S. W, L double YiZhenShuJu[800];$ M6 |& h4 u6 G" H/ Q
double dv1[800];3 t3 s) e1 Z7 {. t/ }6 N @$ ^
' |) Z1 s W& R9 E, b4 g
2 e I$ H' Y- C4 B4 [2 L. f double b_YiZhenShuJu[800];( A% N+ e5 ~/ O5 r) R
double I_filtfilt[800];
& o2 f; f. K+ d+ S4 z2 j double Q_filtfilt[800];# R" r$ k, {# c
creal_T b_I_filtfilt[800];! L( w- x1 m+ Z' z# z
creal_T b[800];; Q5 n4 W0 H9 W; j! t$ W. X1 y& T
creal_T RCRxSignal[50];
3 i1 O7 @ N3 E' ^" ^" d creal_T fineCompSignal[50];$ G N: M. R. S5 |$ d( r
double phError[50];
% ^- r* w4 O8 n( T creal_T timingRecSignal_data[28];
; k+ |& R( s. M# V1 y0 E5 { int timingRecSignal_size[1];: f, a9 \) J: `8 C' _4 n
double prbIdx_data[28];
8 y8 w, @2 d( [( U' }) ] int prbIdx_size[1];. V2 d4 i* b+ E+ s* F5 ~& W& K
double dtMt_data[28];* I, |0 S3 C! X- G' H
int dtMt_size[1];
% ?1 s* A( S- B9 }" P" v/ V creal_T symFrame[25];
. Y' A: G9 ]4 h$ P8 l boolean_T isFrameValid;1 a A9 _9 v0 Y+ X
double unusedU0[3];9 {$ T% J* n4 A5 m5 b& W
* h2 ^) Z4 Z0 s
//调试过程中的变量
- G8 p: z! I# o1 ~, Y int enough_data;$ x/ o* M3 |% i2 Z/ R& c
3 d5 g+ I; {. \9 _ int enoughDataFlag;
3 O6 C$ r! j# `" }4 e2 b int yiDuanShuJu_mean_int;" z/ M* j9 ]( B) H3 g5 b! T
int int_sum_dv0;+ o! f* z/ f3 d0 u; b! }/ m
int oo;. `3 J( ?* N0 J( }$ P5 Y
int ii;
3 g& R, K4 u" t/ Q myfuck=10;# Y$ m, v) o5 q( j2 `
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */7 } [2 }7 M9 U( Q. ~
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */: Z: d* F8 E' V1 a4 j* c0 i9 \
* Z7 @% v, x" V
yiDuanShuJu_mean = mean(data1000);, p( {( Z6 i3 R1 }$ Y j
- U' G* t7 A% M9 U+ \# i; i$ [- q
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;7 k( R# M: J9 h2 L' H4 Y5 n j
UARTPutc('A');8 m3 G# `0 h' @( [/ Z, @5 d
UARTPutNum(yiDuanShuJu_mean_int);
8 y9 L9 _5 r# s0 F7 x) [& m" L/ t UARTPutc('\r');
6 H9 _" L+ p9 a% T UARTPutc('\n');
+ f4 Z8 p+ x c- e8 G, s. W+ S: \4 \
for (ixstart = 0; ixstart < 1000; ixstart++) {; u* v9 ?2 _' x9 D' r
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
6 d) }. _$ J6 i$ X5 \ }# Y0 R6 ]2 ^) K! T3 R
3 b' h$ a% F! G$ C) r% A
power(yiDuanShuJu_LowMean, dv0);
) `$ {9 |1 s- E6 O* m- s
* ?0 K' s) @6 }" X" h int_sum_dv0 = (int) sum(dv0);1 m# b; E3 G( Q
( R5 w, [& p' c# A3 Q! {
UARTPutc('B');
, u+ j5 e9 Z& W9 O UARTPutNum(int_sum_dv0);8 G6 c& c" Y, `5 I
UARTPutc('\r');
% q$ z! W# i- n m$ K& G- x UARTPutc('\n');! m& C7 t, y m+ a; g
9 o5 t+ h! @. z- H; b
// int compareFlag = int_sum_dv0 > 1.0E+8;0 v. b5 D; [: i2 K0 V5 m# ^
; N" H/ _! x( q if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?1 x8 w9 o) o% c& N5 v5 b' t# J
UARTPutc('C');* i i1 e, E" _% @, z7 q$ O
/* 比较信号能量 */
. o; a. l9 l) ~6 Y* C /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */- d3 L. h- p y- o
// yiDuanShuJu_mean = 1000.0 * youxiao_k;( _( \# d @7 n; |( ?7 j; d U. x
// for (ixstart = 0; ixstart < 1000; ixstart++) {5 T+ L; `2 N4 w: X1 E
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
' k1 W: I0 W9 s# [+ `// yiDuanShuJu_LowMean[ixstart];% d( n; \9 H+ a4 R! F* ~1 n" k
// }$ F2 p: G) Z- ?! e B; a( R: a. S
//& C+ S, x& l1 \: Z1 H3 M
// youxiao_k++;, ~5 P' G" ?6 i2 m9 M
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==* ~# r4 n' k2 W/ }! K5 t/ p
// /* 感觉要取21个数,即0-20, */6 Q- \9 A) X/ _9 u- h! r8 y
// enough_data = 10;//有效是10,无效是01 U: p; C; P& |4 Z: W! j
// }$ i3 b0 c. R! ? R2 {
}
4 ^( G% }1 z( e8 |9 Z1 |) ~: |/ `0 e8 i! n
0 ~* K. t# H% Q/ M! I0 f enoughDataFlag = 100;
& B! b Z' w0 ?7 L8 ]! x5 E4 V/ T enoughDataFlag = 1000;+ S6 o8 ?' b P5 r7 b$ {% ^# y; Q
enoughDataFlag = 0x02;
9 b1 D8 N# g/ |9 `( ` enoughDataFlag = 200;4 O. ~7 O' W) \" l7 h7 Y! ~" \
; D1 {5 Q6 f( V) Q* ^' N
int myfuvk1;
+ R; S8 w) s5 Q myfuvk1 =11;
1 g2 y3 z/ W; j
; w+ E. z5 x+ p$ {: h2 W2 w% \
4 V( v" Q, |3 G: w; j enough_data = 0;
p' I6 |; x, ` a4 ^- c0 P# D1 Y9 u! @2 S$ S! L
// if(enough_data>50){: {% d I$ |3 x! M/ f. Y
// enoughDataFlag=0x01;
1 Q+ @0 K+ D; [// }else if(enough_data<50){
' z' V7 Z- m( ?4 W( R; F// enoughDataFlag=0x00;//0x00还是不行9 r! J, C1 C4 _9 K! C, A
// }' z- V6 D" j* v; q
" {1 p3 {9 t4 w! O* s
' s- d' T: N; X7 Q( X5 j% W Q oo=10;
+ S9 m' F2 U4 q% g" R oo = oo < 5;. }/ ^) B' {& D. M: B4 r% J
if(oo){
' d( D! R, H% O& e ii=0;, k% j) _7 E: a6 ~3 j! N9 h, R
}
0 B; m- P: M& w+ @( i if(oo < 5){! D, ^3 Z! ~1 Z1 ?6 G5 x7 g3 W
ii=0;( H. } j" U9 P: E1 {/ G
} o& L0 b* [; u% `- o3 F7 @; `
if(oo > 5){3 u: P' \. v( h2 q
ii=0;
9 E, p' M) j. k/ F& e: u }+ z, E, E0 ]/ j) u2 Z
# f/ P/ P z$ W7 t+ M) O3 b+ I
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
" s4 \7 P& o1 k0 w/ e /* 如果数据足够才执行主程序 */
) s0 p- e! j5 q5 F oo = oo < 5;
; l7 E4 u! t9 y! r. e2 m% C6 F enoughDataFlag = enoughDataFlag < 5;8 Q3 e1 l2 V9 C; m- d
if (enoughDataFlag < 5) {' [# v( R2 n; b7 L) Z1 x# f' `% O
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
8 z3 M: n( y/ w/ \6 X AGC_AGC(&pAGC);
4 r+ I$ i8 C$ X0 a) s6 q) r* w; c1 A& P- T! b3 Y, i( B
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 b4 F$ _# ^; g% o4 G+ t7 d6 V5 _/ d
FIRDecimator_FIRDecimator(&pRxFilter);) C$ `0 [4 l. W0 `& ^
* i9 r% X. U0 N4 r* J& ?$ d6 N! F /* Downsampling */
8 L& v* L, O' j6 {9 m3 \ c_SymbolSynchronizer_SymbolSync(&pTimingRec);
' F2 l) J2 U0 s9 r" q7 y5 \' p8 s
* i D1 X; z9 |8 w9 m! s( n$ i2 [, A( ? c_PreambleDetector_PreambleDete(&pPrbDet);
9 N$ p8 y. E+ F) `. y! Y- F) N+ G# M) m( |6 t
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
; a7 x& {% _+ Y5 h' R' H /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
! c, h0 S5 x$ C Z /* %帧数量=100 */
( f. a$ P& j( d1 r3 E pFrameSync.isInitialized = 0;# g0 n* _1 V; p$ w9 y ?
1 h, s$ d% p2 p l$ D /* [EOF] */+ r# q7 X, K( a
/* 前导码长度是13 */+ T6 A5 A! r0 _5 g P9 i
/* %qpsk */
* A* f% N. S" }2 E+ ` pDataDecod.isInitialized = 0;
& G* b' Z9 r8 z3 H( L+ E" ` G9 V
/* end */
( F9 F8 H' I V1 q" I* j) [. A+ K! { /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
' A8 L0 U# i6 {# Q0 p% ~- A /* Convert 3-dB frequency */: ^ S! h# D5 v5 G1 @- a3 W2 G5 h
/* Convert 3-dB frequency */+ I/ F& |. h2 j- Z. ?; X
filtfilt(save_buffer, usable_left_filtfilt);
3 f9 [* M0 r5 P6 b for (ixstart = 0; ixstart < 81000; ixstart++) { J' K, B* z! J% ?+ l6 N6 K
usable_left_filtfilt[ixstart] *= 2.0;1 K3 U: b7 W V- J; Z4 C5 _1 A
}
: R; g2 n1 k" |# h
+ x3 z% p* Y1 x- z8 S /* 注意乘2,处理幅度 */8 `; X6 n6 F+ d) a; g) b
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
, P6 ~; O( W/ k, H) A /* %% 行列转换 */' a V2 ]" o8 S% I
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);3 {( Z$ p+ v% h3 K6 a+ s
for (ixstart = 0; ixstart < 81000; ixstart++) {
- t- W% _: H) [0 @5 b/ R youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
4 B* Q- i# I8 h* J - yiDuanShuJu_mean;! w" Z# P: W1 i
}- ?2 M! p& Y' L! \. W# T
7 m6 s5 D1 l- s0 C
/* %% 应该对数据归一化,但是这一步放在哪比较好 */& `0 O, Z! S& }5 W4 e+ B: f
ixstart = 1;
0 q# v7 d& ~0 q7 m* A% r6 c! k mtmp = youXiaoShuJu_QuZhiLiu[0];
3 }0 z# I1 K- Z( N, ~ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
% o+ D i: w5 J8 G f9 t ix = 2;4 W3 F: L, |7 C$ Y
exitg2 = false;* e) U; c0 J6 P
while ((!exitg2) && (ix < 81001)) {
1 `! X3 H9 F, `: R3 T ixstart = ix;
( Y$ T: K, g6 c if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) { i2 Z' L& w8 |7 j% D2 ]- f; ~. x8 O
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
" t4 i" ^+ n8 T0 I1 X' L& q exitg2 = true;; T7 O$ m7 i; {. A" C' ]
} else {
0 ?1 I h. w2 d6 h8 J ix++;
. k$ V# Y0 c, X7 n }
* S$ j, Y) }1 c$ X1 Y1 _+ {# F } M( R8 _- a1 R4 e
}
8 q7 a/ ?$ i( V5 ]2 y5 X. H( f
2 Y0 Z2 Z% R& R) y! I+ h0 c if (ixstart < 81000) {) H, T4 R2 @7 _" s/ [6 O
while (ixstart + 1 < 81001) {
( S! o' `* O/ w& Q% T- Y if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
5 J9 S8 y; a2 {0 W% l mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ d" H& ?( I( |* X, @7 S& o }4 x5 \* {" H9 |
9 c& H8 G. t" G2 n. f, A( B ixstart++;
/ \; L& G _( w. u5 t* |: | }
% [6 {2 v% z6 @) [8 w8 ]2 J }( l( s' e' T0 F- d; X
7 C' P% ~4 V8 R- C" A ixstart = 1;
3 m6 J- | a" s% [+ _ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];/ c' ^1 `9 d* O( o u
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) { I4 l1 U( e8 z/ J
ix = 2;
3 }# o- K3 j" E3 e1 X exitg1 = false;
4 D8 C/ j, v. k& ~ while ((!exitg1) && (ix < 81001)) {$ T2 v% h# h$ V; `1 T
ixstart = ix;
- ~0 D! H5 T R: ~0 g0 i if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, M8 L0 ~, E9 T; b8 [9 t. J X yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% f$ K" o1 f" L
exitg1 = true;: ~ ^% t# ~5 j0 `7 _
} else {
( z! f8 S7 I) B; S ix++;
( }# `6 h% X" X# x# U/ I }
8 ~- K8 M6 g$ V }
I. U& n4 ]% t& q, b }; O3 J: Q8 y' k8 Q
3 e8 u4 T3 R3 }" P* o% t if (ixstart < 81000) {
3 Q9 {% Z& [" H" q; e while (ixstart + 1 < 81001) {
# t0 y8 C- F1 d( d if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
. t# |) `6 a3 E" y0 \% Z. s$ i5 Q yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];6 \0 g: ^1 z; w3 i0 E" `5 [
}
, I P) Q: V# E# [; n6 l( O. f7 ^" B/ d! ~& q) U
ixstart++;
- K5 T5 b& ]5 t) [% I }8 ?8 V$ V1 l+ v4 K4 o& F
}5 X W6 `' `0 ?# |% g9 i! `# I# ?
M) Z+ X! `( U" t% P yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);( g L0 D+ p& e+ q* v3 c% u
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
/ p' }0 i# j, y yiDuanShuJu_mean = mtmp;0 O5 x' C k* P9 R- @; h
}
( l7 y3 ~& P, s L6 G
$ t9 c! A# I5 j6 c+ {' `% q8 M- {; N /* 找出极值 */
: W# h: D: ~( o for (ixstart = 0; ixstart < 81000; ixstart++) {9 E' H+ ? H7 |
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
! z8 P% e6 b4 P }
7 U) Q% t& o0 h% G N8 e
, h% |% V. R5 b5 B) g- _: K3 n --------------帖子字数限制------------------1 |: J M! p, Q3 A. W) c
}% I" M4 B2 Y3 f. M3 r
& @" R" F9 ?8 |1 Q: b8 n1 t i
& L6 h2 k. r; y/ A1 g; J1 Y. a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|