|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 3 o. D) W% w+ k* _3 I
( _% _2 V1 D3 \2 ^# x( f% l
各位大神:4 u4 n3 ]; T: l! t+ N
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
3 P1 \* ?! o8 i! ^, A) } 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
) z1 v: G( p; g' K4 h9 b" X& S( ]- E
3 u4 S9 v4 L3 F: z8 G
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。- X4 p9 X: n# V- d
( ~; n$ V* b+ j( z6 [6 P
并没有其他线程8 o! T; v1 z1 m# t& x# j* f
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% l: i- B6 u8 V8 o9 M$ f
也说不定是和堆栈有关系。。。。。。
) E% y5 Q) q( g$ a: d请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
3 b+ U2 g6 F. v0 H7 z6 {! R: A5 B5 c
) p( v% f" } k6 z( X( L, H
/ Z% d' C K6 A/ B5 U
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* b @+ d0 ?: u1 q, n
7 i; Z5 R* _/ ~ J7 g
" e* @/ v" |3 \% |0 j+ k* T附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
8 {, v6 {1 O2 [3 o2 I8 C static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
1 T9 V) g9 m. G0 I0 M( U4 t! ~
2 _7 d# X y% Lboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(4 g' X7 d! O L- w" N! e
const double data1000[1000]) { Q* }" |) {$ W- A! \) \
7 ~0 U6 P4 a2 |; ^* b2 r4 O
int myfuck;7 S. K0 `$ h9 N2 ~$ [
double yiDuanShuJu_mean;6 i2 r, y& i) c; K7 q
double yiDuanShuJu_LowMean[1000];, x6 L# a% g5 n% [% i
int ixstart;
9 @' r& p; L% |+ z4 ?" W5 E5 N double dv0[1000];: m. O" W3 X! O# t
comm_AGC pAGC;
) c3 _: u+ c+ O' b3 s comm_CarrierSynchronizer pFineFreqCompensator;
7 I! h/ t( u. i- z# e$ V dspcodegen_FIRDecimator pRxFilter;) L( N6 a* p5 l2 t
comm_SymbolSynchronizer pTimingRec;
! l! [7 \3 Q0 K8 g; n comm_PreambleDetector pPrbDet;
5 o2 b ?! G- s FrameSynchronizer pFrameSync;3 a7 t3 T' c- ?1 O D
QPSKDataDecoder pDataDecod;) w7 a+ v. q* X: M
static double usable_left_filtfilt[81000];; @2 i- q# \" H( A9 s9 j
static double youXiaoShuJu_QuZhiLiu[81000];
3 g6 |( a/ P3 {( }6 h+ _1 X double mtmp;
" e) }4 T. P- { int ix;% }) h! B& d1 B- c
boolean_T exitg2;8 S) B% n% m P8 M) C) ?
boolean_T exitg1;& j9 z/ n2 x$ U3 k
double YiZhenShuJu[800];. l: |5 c$ q: X& g2 C. |8 J
double dv1[800];
d* d% o4 E, n+ w/ [* u6 b: K5 k, M* A/ e* {4 w- V7 F
G; R# i4 v9 H% o" D
double b_YiZhenShuJu[800];
8 v8 n' Y2 w6 `- W/ h+ m. c double I_filtfilt[800];
- D! I9 F3 e/ ?, G( b6 @9 R double Q_filtfilt[800];5 x% {* N, N8 F- h4 q5 J7 i
creal_T b_I_filtfilt[800];+ X9 s7 y/ C( z& D& M7 \
creal_T b[800];; t9 E! G% w9 I3 c& l5 {
creal_T RCRxSignal[50];6 j, e* Z5 i- u! B% r0 k9 t4 P
creal_T fineCompSignal[50];$ ?* Z& F5 `! n3 J% D# j, F0 p4 l
double phError[50];5 J5 z0 R- q# f9 e w+ Y
creal_T timingRecSignal_data[28];# V+ H. h7 |* m" H: W6 P$ W7 B
int timingRecSignal_size[1];
, y/ G& S' _- y1 h double prbIdx_data[28];
) O3 A$ ?0 d% U5 `- A( D, O5 ~ int prbIdx_size[1];
& X: m% E4 k8 h/ ^5 Y4 d" T double dtMt_data[28];4 u! i% E, |& p5 z7 @
int dtMt_size[1];
8 B! d0 S6 z+ i- z2 \) S creal_T symFrame[25];) l( q5 s( x8 B6 q3 o$ v/ Y
boolean_T isFrameValid;. d' d7 H9 p, C- K1 I) b! x
double unusedU0[3];% s3 ^% g. P0 y4 J: c8 [
2 Y2 g3 u: o# C/ w. N! d
//调试过程中的变量5 m! e4 w& r+ L: V' U/ U
int enough_data;" ]) _" w. k) b9 V5 c
! r9 j/ d d9 I$ c( M9 A int enoughDataFlag;
$ d7 K* {8 N% `. n" Y int yiDuanShuJu_mean_int;# ?5 c( r% _! [2 j" y0 g9 L
int int_sum_dv0;
. Q* z. \. J" O& o" C. H1 R int oo;
0 e: x0 s# @0 P) ~& p. A- Y: Y int ii;+ R! |" {9 S" @) Y9 k9 ?* |8 f$ n
myfuck=10;
" ]7 r2 W) K" u( M# g /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */) q7 G3 J% s; l9 F
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
; `% P( p' T% u2 T1 D9 r9 n1 T5 u4 m+ W* M9 A
yiDuanShuJu_mean = mean(data1000);
+ C8 b$ n- ?3 A8 T( _8 [' n% p
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
) I* X! f. F2 D! \: p( N( s4 N8 w6 _ UARTPutc('A');8 N. G# `6 Q. [: G9 F% m
UARTPutNum(yiDuanShuJu_mean_int);
) w" f" ~- a0 d: o1 x% @" Z UARTPutc('\r');8 q& n, A2 X( z k
UARTPutc('\n');
4 j( [+ c0 T+ Q% R2 e( W0 Z2 O2 S
for (ixstart = 0; ixstart < 1000; ixstart++) {- K% U8 |+ \% p$ F( R9 W
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
& Y) R8 H. M+ h* }: V# d/ R }- w0 k* S, d X
5 ? ]9 S; j/ E2 P% O power(yiDuanShuJu_LowMean, dv0);. v S1 N; W2 U+ E8 G
' T+ g; O- H+ J) W# d- X
int_sum_dv0 = (int) sum(dv0);
# j: e- e. r# M! E# Q& D! q1 ^- m4 K( ~2 ? L6 @& c' v
UARTPutc('B');
! b' P1 n, d: D, |, ~ UARTPutNum(int_sum_dv0);
# P- K1 c# E) G; k9 p) I UARTPutc('\r');
3 l- l1 A/ T. a& ^. u- X UARTPutc('\n');
: ^1 v1 _* O$ @( @, S/ `5 V# a' g+ |: M2 J
// int compareFlag = int_sum_dv0 > 1.0E+8;2 M! k- C1 C) |& P( z* p! o
. j. m5 _7 W4 {& r5 | if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
4 k" j4 K& \) T, t" w UARTPutc('C');
- z u* G% E$ K2 T! P% e H+ u+ ~ /* 比较信号能量 */& c; V) _) A6 I9 p
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
: t. a! h9 r) B// yiDuanShuJu_mean = 1000.0 * youxiao_k;- Z& a& v" D0 ~) s
// for (ixstart = 0; ixstart < 1000; ixstart++) {9 C5 B" b& O: }# g: D9 x5 d/ h" Z
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
" B- V* X4 O) s2 b* K. h// yiDuanShuJu_LowMean[ixstart];
) j5 G u! @$ o& p// }
& y/ B, C2 a8 B2 H" m//1 p6 g" K/ _, g* [
// youxiao_k++;4 F9 C6 V& u) D1 F/ R
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
/ c" r8 m3 `& j/ g2 j" A% A/ ^- o// /* 感觉要取21个数,即0-20, */& E6 Z% O2 X$ Y* {7 x
// enough_data = 10;//有效是10,无效是0& v3 P# a! {8 ]" v' T* p/ Z
// }
! a. @ w! m* [2 ` }) e' z; {9 s: h1 R5 T" h9 W% N: Q
: m7 M E% f3 ?+ b
5 L$ d8 I+ [, q+ S; s
enoughDataFlag = 100;- z! Q$ \) @2 y5 W7 [0 [5 H
enoughDataFlag = 1000;
% k* ]9 g' e: I0 ] enoughDataFlag = 0x02;8 l7 z$ m6 W2 I# n3 F! D# `
enoughDataFlag = 200;/ W+ K% k2 K6 [4 L" J
$ D( `; Z0 h4 C6 b6 H" d
int myfuvk1;% K% j3 j E H: J. a
myfuvk1 =11;
( ^* R* E6 ^' R/ p0 v' R. f' R% R# H$ p& {; F
7 r+ M3 v9 \# _6 A9 A/ Y `4 } enough_data = 0;' N5 i" j0 @: o: h2 n. @
`" X- C+ U$ A" ?' R
// if(enough_data>50){
) e# V6 X# |$ Z1 R+ L// enoughDataFlag=0x01;
5 K& l. K# r! u8 i+ I* I! R// }else if(enough_data<50){, @4 L, l# M; D
// enoughDataFlag=0x00;//0x00还是不行- p0 N4 A# [2 m) {8 z x
// }$ N I- j2 U) a
! W; M8 |5 D# U/ T% z
" U" w6 l- W- b3 v8 K6 C oo=10;5 n" K6 x. F' b+ O
oo = oo < 5;
, y4 C; _' I% w if(oo){. {* Y E1 ^. J z1 D5 C
ii=0;! A( V- W" p% r7 S0 U( l+ o# p
}' d1 X( k& u+ F2 E9 ]6 X+ R+ X
if(oo < 5){
5 r( a) S: o2 U/ c ii=0;
1 a# y. D% _8 x) r }
2 N# X8 X2 G# I! A3 u' | if(oo > 5){( [% h# t6 m! V2 F, A1 c
ii=0;$ [& L3 r+ V% _
}; d7 p) K/ P6 o# J$ A
; K k q( a: ~/ V9 _
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */6 r2 Y+ C) q, o6 b
/* 如果数据足够才执行主程序 */2 |% x! v. {9 x
oo = oo < 5;3 Z! m+ ^2 b/ A2 S$ ?
enoughDataFlag = enoughDataFlag < 5;6 Q( P5 y; G9 K* ]+ T
if (enoughDataFlag < 5) {
) M0 K7 \8 e5 d& O) R, f% i4 _& h1 L// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0$ d( S/ K& R2 e8 y" j6 L
AGC_AGC(&pAGC);
5 W% m/ Z2 S4 Q5 B
* Y# f7 L7 o o* r0 L c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
# X6 s2 e" ^5 i FIRDecimator_FIRDecimator(&pRxFilter);# z9 u$ I- r" \, R: c {/ V
2 F, o0 c, X" \7 ?4 ]
/* Downsampling */
+ q8 I _. q Q8 \6 m c_SymbolSynchronizer_SymbolSync(&pTimingRec);3 W) H, e/ Y. h2 B# V9 M
4 w: z' ^' _7 q- p0 i, L
c_PreambleDetector_PreambleDete(&pPrbDet);
+ w' j+ T! ~" P3 d8 {$ X j; l, p, |5 n8 R
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */; Z8 Z! g" d- c" {* Q
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
( A2 h( z5 o3 r8 @: n8 Z/ I. U /* %帧数量=100 */: `0 l, q7 J' p
pFrameSync.isInitialized = 0;
Q6 x( C, ^: }/ V/ f# E! p+ C6 D$ b) z! f
/* [EOF] */
! a/ G; s4 `: w* c /* 前导码长度是13 */. d6 k; [/ C0 S! x& W
/* %qpsk */) D2 |; b# A8 S3 H
pDataDecod.isInitialized = 0;# U4 l- n* K K. J# e8 Y
) a" v6 J% o3 L2 e( @' _
/* end *// i% o( G: g% Q9 @( n7 G6 A
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
3 s! `$ `/ M2 j7 f /* Convert 3-dB frequency */6 {$ \) O& ~$ Z% X) t$ e* X9 C
/* Convert 3-dB frequency */
. z& u- e$ _! e' h5 X, H7 s, w2 ` filtfilt(save_buffer, usable_left_filtfilt);
7 }& W: a* i' Z) | for (ixstart = 0; ixstart < 81000; ixstart++) {
' j G( X5 X/ \! o5 \8 m+ t$ W$ q T* r usable_left_filtfilt[ixstart] *= 2.0;! H% q- z% Q9 w9 ?+ m% P* _
}0 a# g" a5 f8 H0 q
7 M/ Q/ h4 ^* i2 B1 }2 Z /* 注意乘2,处理幅度 *// X1 Z) o4 n' Z! o! S( _7 g
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
) y0 ?1 C2 a r* u2 J+ Z+ C3 P7 ` /* %% 行列转换 */. ]& i6 v) s7 {3 v7 D! j
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
- h% k% E/ }6 V1 c9 a for (ixstart = 0; ixstart < 81000; ixstart++) {& W' t6 v. i3 B- d
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]/ L7 U7 b; x3 P, s3 D: L
- yiDuanShuJu_mean;4 c1 D4 k1 P1 ~- h# ]
}
9 i9 }9 [5 [# ]' a8 W2 x$ M* S
5 q3 U9 T5 x/ h' g4 A9 g /* %% 应该对数据归一化,但是这一步放在哪比较好 */
. r5 T* E3 v ~$ ~" C |$ q* f% g ixstart = 1;! \- X* ~* V( b3 H+ L, K
mtmp = youXiaoShuJu_QuZhiLiu[0];* X* D! D( n1 T7 Z& O% |2 U
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {) Y7 k( J: g& U( t+ m
ix = 2;
2 x8 i* G! f5 P8 T: W0 N exitg2 = false;# \9 V( Z- J- j' O V! ?% V
while ((!exitg2) && (ix < 81001)) {- E& l/ J& C/ f8 Y/ T% E) q
ixstart = ix;. [4 h0 J- n. d9 O1 N9 _6 L
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, @9 c5 R% U( X& s* ^
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];! J, E% U4 M+ Q( O, Q2 T) H
exitg2 = true;
2 H( |9 g; j/ W! ]0 {( T } else {$ `; F' A1 _3 l" R
ix++;
) z9 ^$ N! N' c" l9 C! c4 {" h0 h }1 {4 V _+ b4 d' n7 o
}/ ]2 V6 ~; T: s$ z% G
}
" l% h* o* C7 D N* v) G' S. Y7 R/ B& b: e- `& ?2 K- ~, X
if (ixstart < 81000) {
' n- {) _# L2 F1 ^* l while (ixstart + 1 < 81001) {1 B$ E: X. L' g- W/ c T
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {+ n( g' N% g' E$ i% e
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];% _/ j+ L% f. w' ~! `5 u( f
}
! t8 ~& K6 Q2 X; ^; _5 I1 |4 A P% z3 a" D
ixstart++;9 L4 B4 j: {1 |( w* f% a: A0 D
}$ @6 P: p- ]( C( b/ q
}
7 e: C+ A. F q3 E) H$ T' s' G! m: Z
ixstart = 1;8 b( A) q- [8 N1 U( z; E% y
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];! e) M' X- I- C* _ k$ S
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {! ?" U2 I, w; u! O ~" P
ix = 2;
: s5 n1 M5 r/ ^7 S3 W( t. ~0 |# C exitg1 = false;( u% R9 W# F @1 m j
while ((!exitg1) && (ix < 81001)) {6 x0 h# [" V; y
ixstart = ix;
& f0 A! h7 K$ a: ?1 C if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
) v# ?* W$ v: y, n1 R% M6 o* u yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];9 d) t& A- \- k: O1 @
exitg1 = true;6 j( `3 m( J$ I2 x( x7 o& A6 Q
} else {$ Q t" E7 a; {& E
ix++;
4 i* t% a6 {, i* M, w* r( s2 I( r8 s1 C }
% @3 D% l+ h' a" X. u# L4 a }
8 C. a( {# N; T+ A }: u/ r% b/ f. s3 Q+ G8 Y$ ]
, `3 u' @) h! z# E2 i
if (ixstart < 81000) {
3 G+ {# S% Q. ^ while (ixstart + 1 < 81001) {0 y8 D2 X' o6 H# d
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
' c: [$ l* }+ q0 C8 Y9 _ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];! ^3 X/ N8 c5 S" d* }, e' N" \! z
}
# f# \5 j6 R9 ?$ n
6 W- {$ x$ ~/ @% y x8 M ixstart++;: `7 T& U$ k$ g
}+ e2 X) p& y& _! d* o) {- P
}7 J+ {' z. l5 c0 ?8 ?5 u$ f) O# B
8 P7 w4 F' L/ `. O) |& R3 j5 u
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);) [. \- j$ m& @9 Z) f$ u
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
. s; H4 a8 o8 J6 F; Z5 c" y& C3 k3 f8 [ yiDuanShuJu_mean = mtmp;+ g f# M4 R6 S2 L% }- j
}
6 x/ B/ G% N5 ]: L0 B6 y! V+ N$ y1 ~$ s
/* 找出极值 */4 D3 Z! H% P; v7 t2 t
for (ixstart = 0; ixstart < 81000; ixstart++) {% B9 Q# _8 w8 U% R9 z! Y3 v
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
& j1 k4 I: J7 C# }' c1 t }
8 r r" l& I9 p: p
( a2 l0 O- m0 q x3 t9 K --------------帖子字数限制------------------
8 o# [/ Q' @) N9 h8 ^' N6 Y, J}4 z1 G( ?$ u2 _+ R7 {" [
, ?, P, z5 Q6 s1 R( H3 r4 u5 U
0 l R |, C' X |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|