|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ) M( V. F" L0 [+ g" t2 i" w
! C4 S: i) U. F2 Y) `* @& P7 Q
各位大神:* I3 q6 D8 ?: e2 W& \8 p
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
Y1 F1 e8 l3 Y/ K( }& j, u" z+ `$ { 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:6 \1 |& T' F) ]1 |
& m+ Z4 N! y D6 O- A& ~4 h* K
* q# }- i9 T: c& H5 ?
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。4 X1 K9 i; k* w
& q/ d5 Y* Q7 Q, [/ r, u
并没有其他线程
* ~9 X5 |! E2 t7 y# q反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。0 q/ L+ O" J5 z0 ^, \
也说不定是和堆栈有关系。。。。。。3 d% R: J/ l. f
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
* h9 ?- E, T0 {, ^7 g! b% j2 S
. Z. n8 z! u0 E$ w c+ d5 D
9 X" N8 {* O+ U, D" J" h# J$ d% N, M6 |
我也很绝望啊,希望大神能帮帮忙,感激不尽,!/ N2 _/ B5 D( P f
/ F) |3 c- W2 o7 n- \
$ E$ S4 q4 w7 _: H p* _3 i附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
0 P3 l( F& e3 h. F7 j% O% q* r, l static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。 U0 S) H2 C: {
. P% C$ h6 }' W0 Bboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(8 E- F1 _+ j9 [
const double data1000[1000]) {: w: _1 n! F% g+ m+ O" _
2 i5 S( x6 `. U4 N0 e* \
int myfuck;
0 n7 l4 R8 j) R2 N- o+ l double yiDuanShuJu_mean;
9 B: h6 h+ ?5 r7 Y. C: l D double yiDuanShuJu_LowMean[1000];+ R8 }$ s2 `- R8 z2 G0 p" T
int ixstart;
! ^+ \' s' H; U$ N! | double dv0[1000];
! J* o+ v @* |1 a( t2 a* O: M/ e comm_AGC pAGC;
' l* I0 \$ `$ `- ~ comm_CarrierSynchronizer pFineFreqCompensator;3 d& N0 o2 P* o* f z
dspcodegen_FIRDecimator pRxFilter;, Q# A" ]2 N, ]2 a
comm_SymbolSynchronizer pTimingRec;
( O! i! z H: L* r6 o3 J% B comm_PreambleDetector pPrbDet;
# Q. g: \. V7 A; y( ]/ @6 U FrameSynchronizer pFrameSync;9 f0 s" B9 ]0 @& R' M
QPSKDataDecoder pDataDecod;) b* [/ T2 e, v9 m X( z' |
static double usable_left_filtfilt[81000];
) u g, k: ~* n, Y- f' y# [/ t$ O static double youXiaoShuJu_QuZhiLiu[81000];9 k6 S- S0 r! P2 d/ g( Q
double mtmp;
# o0 i* E* j9 {6 k6 x int ix;
5 h7 E; c0 B' G) S boolean_T exitg2;. G( R/ Z% C( r! s
boolean_T exitg1;
" G: @ B% s) I3 H6 v* k4 _ C double YiZhenShuJu[800];
5 B* ]- L) v3 r double dv1[800];
7 G t+ ^, }* w- P
% F7 R& U, G( m' T& W5 }4 \3 J' {3 r. w0 J: }6 d( y
double b_YiZhenShuJu[800];! a* j5 n: D+ G
double I_filtfilt[800];
& e8 t& Z* T" h* Q$ I, {/ w. C double Q_filtfilt[800];& {- I1 M6 q9 d
creal_T b_I_filtfilt[800];
1 g, F. P( C8 g3 s# S4 {9 T creal_T b[800];
& z, \& Q# V" _* { creal_T RCRxSignal[50];. }3 k1 i8 \4 r. t6 `" p
creal_T fineCompSignal[50];
5 X" m. [8 {# z9 K. j, J) g! E; } double phError[50];
7 s; l' n' {/ `! ^ creal_T timingRecSignal_data[28];! L- E5 \& u$ W% p, u# L+ V
int timingRecSignal_size[1];# | {2 M6 S! ]& y( l5 r6 c5 C1 L
double prbIdx_data[28];! _9 I! N1 q! Q/ P8 P# c! G
int prbIdx_size[1];4 j0 M7 N/ `& b* N$ D6 i% O
double dtMt_data[28];+ q7 N4 ]/ `* F1 j) d; @! g4 V
int dtMt_size[1];
- m1 @5 T. l. |# x creal_T symFrame[25];- [% h& x4 C( m: k1 k* K
boolean_T isFrameValid;
; @( i; l& t# X. S, u6 w" i- g double unusedU0[3];
8 ?$ j, s. z% w3 Q- _ E; D. {8 ~3 L
//调试过程中的变量
/ F" z( p7 D6 o s7 G+ k int enough_data;1 Q X/ u, R6 T& D5 l+ G. r
. a6 D4 {0 X( u3 `$ I p+ f
int enoughDataFlag;. j/ _1 A9 w& I% _& K( l/ l1 s: ?
int yiDuanShuJu_mean_int;% T' R- }- p8 U' `2 h) B0 O
int int_sum_dv0;- K! K! ?* ~) M+ U% M% @$ _
int oo;3 U" h7 ?- H( O6 H6 u# ^8 }: w0 V+ k
int ii;+ ^, u6 I; s3 M7 V
myfuck=10;+ x0 x$ @& L+ D& ]% l* V- K
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
/ e% Y6 c9 Y- n2 v. a /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */2 V1 n0 J9 R7 L" Y' x
s; |- N0 x! @+ {7 O
yiDuanShuJu_mean = mean(data1000);6 T0 L' K4 }0 t. D0 ]
0 V$ }3 f- N$ B! R yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
' D1 H2 A5 r4 D$ u UARTPutc('A');
6 V9 C4 y1 s. Y3 X, U; A UARTPutNum(yiDuanShuJu_mean_int); J! d$ |+ v% G3 O; r4 W
UARTPutc('\r');
* k$ B7 f2 Q. w, K UARTPutc('\n');- S; V; P. L$ _& N, w& z
0 |- j( P: |( F5 y/ O
for (ixstart = 0; ixstart < 1000; ixstart++) {
$ P: a2 K6 ^. K! W/ J6 ^9 V7 P& }( | yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
+ Y5 r6 ? m6 M6 J }
/ X! i/ h" f2 P7 m, G) X, Z/ l- F8 \1 H- Y8 \4 X- k% N+ }( N5 Y* Z. M
power(yiDuanShuJu_LowMean, dv0);
0 y P* ^, G z& J: o2 P: `3 E7 P) f+ c8 G2 j1 V
int_sum_dv0 = (int) sum(dv0);2 l# p# i1 F$ g9 o4 o
8 t% \1 X6 s3 Y- R, O
UARTPutc('B');5 b5 _; _2 N4 r$ e9 _
UARTPutNum(int_sum_dv0);, P% O* v" d8 a. H
UARTPutc('\r');. k; I6 _* T4 z: ^
UARTPutc('\n');! H& k, O; k m+ {7 I5 m P
; p0 {2 B$ v5 F: N e' k* k3 D// int compareFlag = int_sum_dv0 > 1.0E+8;8 A" P: t% ?5 p, m- g+ C' s
$ n% A }8 w8 F0 k# C
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?3 l2 ~2 u0 D' `0 O0 b! d$ m
UARTPutc('C');- }" e2 B1 m4 ?& o* j- @+ w
/* 比较信号能量 */3 s8 a0 u- k" G" X3 {$ @
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
; _; s! |' ~. Y8 s0 S// yiDuanShuJu_mean = 1000.0 * youxiao_k;" D- \) z( ^7 |+ V3 H2 q( F
// for (ixstart = 0; ixstart < 1000; ixstart++) {% o! E5 x+ F, t& Z/ c
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 n# \5 k0 U. R" ?0 s" M; n, W
// yiDuanShuJu_LowMean[ixstart];- E# A+ C7 J* U
// }" c6 i5 D! b. R# R+ A$ {* w
//
H4 V# {9 C9 J9 k/ F// youxiao_k++;
]& y! [8 H# U0 E9 U; O: `// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
0 `( A5 l/ L2 y$ O! J// /* 感觉要取21个数,即0-20, */+ k! s2 D. l. C; x! ]* E
// enough_data = 10;//有效是10,无效是0. N) @8 n$ [& b' I/ m; I. X2 T
// }% @/ h) k, Y1 C
}+ n& d$ T8 p9 a/ B8 ?# F c
( A4 I% y* m7 ^* @5 @( F0 |; z* c% R! X; d: U
enoughDataFlag = 100;4 x; q2 C: W. {. e: J
enoughDataFlag = 1000;1 ^: L; H/ A. e3 u) b
enoughDataFlag = 0x02;
! l/ b4 Y0 T8 \ enoughDataFlag = 200;
& ~0 t# I' }% q8 B* |, f: L/ p& K8 I3 O0 E& V
int myfuvk1;% }1 c" @3 l6 }% B# C: Z
myfuvk1 =11;
6 g$ s5 S7 B$ u, {; e+ u0 E ^% H2 V& _: c. {" {. j8 g
% v1 A, u# o% U7 E( X7 G; B enough_data = 0;
D8 a U+ k- [ f. Y5 d2 F
' D! W: \+ _5 a2 W// if(enough_data>50){
9 s2 s0 m/ V! `// enoughDataFlag=0x01;
0 |1 ?1 a! ~, N* }// }else if(enough_data<50){; c. c. _; }# S8 f0 D. Y
// enoughDataFlag=0x00;//0x00还是不行% @2 s L; s- A4 \- y# G% j9 d4 u
// }
: Z) Y2 y' j1 }# l3 \' V+ \
* ^% J# s: W3 Y' I$ ?3 |0 v9 K+ S" O; {9 K5 X. B" C
oo=10;
) z" l- I: G) n; Y/ [9 `, C oo = oo < 5;
' `" q7 g0 }( R0 ^, B if(oo){, y1 t# T4 w1 z0 [4 X [6 E! n1 F
ii=0;7 z1 X+ w3 M6 |- l( |# i* Q3 K
}
7 |% W+ @2 F8 Q. I' i2 R if(oo < 5){
3 e/ Z# E- B/ S* d9 K9 L. ^! K* w ii=0;* e6 Z) u l' _4 C
}
3 S* c3 Y, L4 T+ C if(oo > 5){
1 M) T I4 f* p$ w& R3 c, b ii=0;
' v7 J' ]' D' W+ y }
% U. y! ~0 L) N. V4 f2 C- N8 ~) I3 n# ]7 E( }3 `- p ]4 _# w- y* k! S
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
3 n3 g3 e5 m: k /* 如果数据足够才执行主程序 */
' q5 G. C- C( {; i; v/ ~ oo = oo < 5;
+ A& Z9 O6 \9 [+ x enoughDataFlag = enoughDataFlag < 5;
! Z' V0 q) {+ q" B4 A6 t9 ~! }# f if (enoughDataFlag < 5) {1 R+ V) l# ^: n- q
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
% [; F1 ], R$ q. o3 J2 l AGC_AGC(&pAGC);. k- A% `9 g$ p8 J' a9 [; m
% O. p; q( j7 ?8 b+ ` c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ k- a F6 [/ k. o, m
FIRDecimator_FIRDecimator(&pRxFilter);
2 X$ |& U5 Y2 |
" s0 r/ `* I! C# I$ o. i /* Downsampling */
d* M9 `$ m% \% i& q; w9 x3 n! ]; y* a c_SymbolSynchronizer_SymbolSync(&pTimingRec);1 |9 b5 H* z% z! o* }- J: u2 w
* z6 H6 Y. [$ ~: B
c_PreambleDetector_PreambleDete(&pPrbDet);
! O* t, `3 R5 M' X+ w% ~, J; M. ?1 @2 @
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */: x2 ?5 g- d" `, S$ A- p
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */& A! A# i" W2 H' s% s
/* %帧数量=100 */
3 R6 F8 D0 Y( `6 C9 H pFrameSync.isInitialized = 0;1 w" k" z e5 E( s2 @/ \
6 c1 j5 ?# |3 t0 N! U
/* [EOF] */) k' ?' S' r0 a4 q9 O3 V. _# A
/* 前导码长度是13 */* [8 p2 E& s) p9 C( }7 v/ ]5 e+ K& ^
/* %qpsk */
: z, n f! u. F! ^ pDataDecod.isInitialized = 0;* L! @- d( Q, F! y% e
2 B h O) Z1 } /* end */1 K- ]. H( k0 b2 B4 {! r
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */& ~; k- A6 w2 n
/* Convert 3-dB frequency */; w" r( E; b9 f& @4 ?0 y
/* Convert 3-dB frequency */! s. v5 A$ |2 i q
filtfilt(save_buffer, usable_left_filtfilt);
: b9 V& P1 G7 d5 w for (ixstart = 0; ixstart < 81000; ixstart++) {
) q% K4 j' [/ Z, H usable_left_filtfilt[ixstart] *= 2.0;0 j, H- s: P. p+ w
}
# g1 g5 `2 h% E- ]
/ {: `3 d9 C" H /* 注意乘2,处理幅度 */
1 C! G. [) x! F- D. X /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 m, z2 N, {3 f0 u: Z' j /* %% 行列转换 */# N. X$ |& w' |7 W/ ]$ @# e
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( Z) ?. a! S' ^8 y; D for (ixstart = 0; ixstart < 81000; ixstart++) {
1 y5 u/ S+ Z: T* |# V7 C youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
5 i: c; p3 g0 e( P: @ - yiDuanShuJu_mean;
8 ^3 `* e( q+ U' e4 G/ Z }& |+ q! R( X/ i$ S% z. u
* n0 k! I4 e1 a: a$ Z
/* %% 应该对数据归一化,但是这一步放在哪比较好 */* J) j7 G# P# ^3 Y A; T
ixstart = 1;, ?2 b. u! C6 x% |, H4 {! f
mtmp = youXiaoShuJu_QuZhiLiu[0];
- ]0 d: J, p' N- e, p. h if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 {6 J6 J- I+ q& f# H ix = 2;" K0 `) e9 l" }6 N2 m6 k
exitg2 = false;
# |3 }: q: Z' U4 p while ((!exitg2) && (ix < 81001)) {
! r: _8 _4 J* W1 r- l$ h( e! _ ixstart = ix;
8 P B5 i7 q7 h if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
$ v. O: x( S( l- b6 R mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
! X& Y* M/ Y0 R9 l) Q4 R exitg2 = true;, U' m& K' p' x3 I K7 l
} else {
6 C& O5 D2 c) J7 ^2 L' k ix++;
& y+ C# a0 i8 v+ M4 e8 B' r }
! l) [4 W3 I' \) Z" \ }
$ N" d4 y# B3 O, k. i2 E7 A }
! c1 a0 E- M9 ]1 Z6 x9 g$ U+ k- @
if (ixstart < 81000) {
7 O% T) f8 Z4 S2 E# D while (ixstart + 1 < 81001) {
3 Q \7 }# ?; z% R" A if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
/ W) f( }) d; p+ Y: { mtmp = youXiaoShuJu_QuZhiLiu[ixstart];) U+ |# n, d7 f
}- F+ P/ s$ {, u
* ~+ n: f& Q" J, W: ^. H" O6 s3 T ixstart++;
* e, y( z- R7 C }" Z( n/ y0 E0 V5 J. u
}4 G& N4 ~/ T( X% e! Z/ m H/ V3 o
! _7 W4 z5 H( Y) D* `+ g
ixstart = 1;; q7 x# ?# [6 M( ?
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
( n7 ~$ d$ ~/ }; p' J if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {$ s- w; {2 r. p! B+ c
ix = 2;
- }% L( n, h8 c5 D- s5 G9 I) b7 b, v exitg1 = false;
8 R9 d8 b/ v: L8 `% [& V% Q! ~ while ((!exitg1) && (ix < 81001)) {
" w+ y' g/ C: O0 T9 `( N& }* S* l% s8 k ixstart = ix;
# _* A* d6 l; V: c. b if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
$ `* u6 l3 v1 _. g0 ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
3 w6 U8 ~5 H" K! I0 c; o% S4 r3 ?# q2 } exitg1 = true;
) N' M5 D* E% E# t! ~( P } else {6 W0 q2 K, N4 p+ s, q z
ix++;
5 m; B- _& }% I J }, z8 f: q2 a; C" @; S6 K+ d& W
}2 S9 m0 ~0 k! z$ l1 r1 I
}* Q! A4 U" D- b+ Y1 Y# X4 K2 H
# @* F6 d- Y Z2 k# i" L$ y7 G4 C
if (ixstart < 81000) {# g8 [4 @! @) k1 n& P* @
while (ixstart + 1 < 81001) {
+ J1 A/ G0 y. ^& c- z if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {- u7 ^2 P6 ]6 J! L
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
, ?5 }/ W f9 W }6 U0 O; [! e9 }# U6 j1 y+ ]
/ b& j* N3 ], n" p z
ixstart++;
]# b& z q: D( P! Q }) N1 M! {' v8 S7 C0 Y$ J
}: w! |* t( [! a4 w( K
' O' V0 Q2 V$ Z$ \
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
( k8 g L$ u* N8 A4 x if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {; ^( Z/ A& i5 u! _7 b2 {) _4 k2 f7 I
yiDuanShuJu_mean = mtmp;5 H$ \6 Y) _: y4 \
}7 x1 U7 G% i+ z* q* b" ^2 q
6 |8 m6 L7 d8 e8 p' s
/* 找出极值 */
5 V$ f0 T: M$ l( I% [ for (ixstart = 0; ixstart < 81000; ixstart++) {( t& V& D4 b+ f' b/ F
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
+ v, Q/ }' U+ x9 ^' Z6 c9 F/ ?4 g }
( h; e. T$ P; }" d, c# x9 ~( u
3 c" Q6 b7 p5 M( f$ E& u; Z --------------帖子字数限制------------------7 Q7 |% p3 H% V& Q( c) }& G$ z
}/ s+ c$ x$ J% G7 K3 S
9 c/ g. X8 ~' k" O
x" b) R% m: Q- a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|