|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
( P3 Y5 m% a; D- S0 K4 v/ r
; c7 {" z& C, a5 y" m$ ^. o各位大神:
; y& a; t: L. R: T7 G. P5 p: Q 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
+ T1 \( ?( s' D4 l- Z 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:6 n4 {) _1 P" R2 E, |, q. z
2 n! ]( I) y5 T9 b
/ C8 n* N+ ~5 K% J# Q+ E$ x这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
3 A6 c N/ }4 Z5 H8 M: A4 g, W7 I' l# b4 u0 U8 Y0 R! \" u
并没有其他线程+ o% {8 B% t; u8 n- |3 ^
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- _) ^. {* _/ |4 l g也说不定是和堆栈有关系。。。。。。. S" f0 y; D( ?/ c& I! B7 g+ q; _
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 u# H" C: x% h! e- E* Z- x: x" N+ h) |) g6 o( j7 r* p( }
% j: T3 n( @2 W& Y) F7 m' ?! f
& _7 b* R% U+ Y5 y& V A: P& q% t我也很绝望啊,希望大神能帮帮忙,感激不尽,!
. R7 G8 b9 z! j% X3 H8 ~1 m' V7 I
9 u+ ~# ?" b: M/ V; u+ R, n( @
( ?, P7 W* E0 r! e0 o$ E附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
, U4 O9 p0 S/ P, }1 L( q static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
' U; B) `6 k4 O: R8 ~7 k3 |8 w) d( P1 A7 t# o$ G3 B# F8 G$ s0 E3 w
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(8 w1 q9 L2 F& d5 H; W3 T# g2 B
const double data1000[1000]) {& [' J1 Q6 G( E$ \* y( {
, }/ u0 K! ^, a: @2 g int myfuck;" I$ v! ]# d2 R) e. F8 v0 N
double yiDuanShuJu_mean;, {/ g# \$ C* P$ H# o, J' H* Q8 e; j( d
double yiDuanShuJu_LowMean[1000];
) ~9 D0 Q$ O) c' [# i int ixstart;; W \+ Q- w" I2 ~9 o) E! A
double dv0[1000];& Y6 X9 C, P% ?3 P( m7 b) l
comm_AGC pAGC;, k( l' t' k! w2 ?; k) [7 [3 W, {
comm_CarrierSynchronizer pFineFreqCompensator;
6 M: @/ o, R0 S# c( y dspcodegen_FIRDecimator pRxFilter;, c( P5 {4 v- e0 n+ ~8 E
comm_SymbolSynchronizer pTimingRec;
* g: W/ q G% A4 J N* k comm_PreambleDetector pPrbDet;
- G% a- B8 \2 a; r k8 j/ l FrameSynchronizer pFrameSync;
) |, g+ C3 g" C! _- v( Z4 @ QPSKDataDecoder pDataDecod;' p @! ?9 H2 r! S A
static double usable_left_filtfilt[81000];
0 \2 `' d" P$ ]0 p% W- S static double youXiaoShuJu_QuZhiLiu[81000];
. [. x; _4 q% [ double mtmp;0 {( I3 Z3 S A! s8 m
int ix;
( o0 b2 l+ V, j# Q9 @3 h boolean_T exitg2;
/ @/ l3 m# G& ?7 h7 L! ~ boolean_T exitg1;
$ i$ Y4 I( s/ B% E" }0 ?: O1 d4 d double YiZhenShuJu[800];" e. I1 v5 \' W7 W
double dv1[800];, ^$ I0 }, F7 o3 N4 h0 h0 L, u- o
, b& v ~( k$ g* e, ^- K8 a# ~! T( H- _/ e
double b_YiZhenShuJu[800];
8 }: l0 ?: h4 Q7 Z4 S2 M( M double I_filtfilt[800];
/ G. @+ W( s/ x- ? double Q_filtfilt[800];
1 N$ A& W2 O' p creal_T b_I_filtfilt[800];
0 Q: n: l( T w9 _! A2 ^ creal_T b[800];9 r) C1 u) A$ T- @4 J0 V
creal_T RCRxSignal[50];
: C6 T, L- t- Q9 A creal_T fineCompSignal[50];
) ?2 b Y7 n1 q& s double phError[50];3 F2 z! |, Z% ~3 l
creal_T timingRecSignal_data[28];
' T$ u# G. N5 ] int timingRecSignal_size[1];5 G; G# F! p1 m/ _! A
double prbIdx_data[28];
1 u. M: L% k0 w3 j- n int prbIdx_size[1];# t4 y; c* L/ R8 B, |: }, e7 b' A
double dtMt_data[28];
) ]9 u8 N/ S$ X! K' s. ^2 @, X int dtMt_size[1];* p. X3 G# \) a" b) q' z
creal_T symFrame[25];$ v0 h2 \+ T% V* o! e
boolean_T isFrameValid;
! e6 Q5 ?, R0 x: j double unusedU0[3];
. d0 g% J/ g. e) q. Y# A9 C
5 ^5 U+ A6 E& D0 e+ J/ M; p$ ? //调试过程中的变量
, [. ?5 F9 X( R( w/ u2 P: f8 ~# g int enough_data;9 e0 F' Y4 I3 ~: W4 T3 X. O: Z6 J7 \
5 \0 T1 i8 ?6 `' G+ X. _2 M" R
int enoughDataFlag;2 |$ l+ }; }( I4 q" e1 s( E" L _
int yiDuanShuJu_mean_int;
c4 X5 U# k( a$ x' h) o% }$ s int int_sum_dv0;: b; ~! _& X2 ?/ E0 `( C% x
int oo;! q7 k8 x+ h Y7 ^1 R) ]2 J
int ii;
, N+ m' s; d6 |# Q* T; E myfuck=10;
3 j# a) i9 v( y, u+ u; | /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */5 [- z& p" h2 R" O) \- ^
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
' g# r" B: J; ^, ] O+ r
9 k: X% b* H4 F2 I' B* _0 H8 Q yiDuanShuJu_mean = mean(data1000);
- F3 n# v. }' m; e8 e- V0 n2 r# C- g; T0 W! F/ h
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean; M) P0 Q- @& `+ o9 N( z0 T( u
UARTPutc('A');
8 ]3 V7 e" Z, K% H# ]6 l UARTPutNum(yiDuanShuJu_mean_int);
1 @/ W' L. j8 W0 b UARTPutc('\r');
- o( d, W$ O0 Z5 ^: o# o UARTPutc('\n');0 B: ^" w0 d" b* Q+ L7 l, w0 M: N' N
1 l8 g7 D* h. C- A6 X for (ixstart = 0; ixstart < 1000; ixstart++) {
! E( z! C7 \9 | yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;, A% F: { }5 b5 ?* z L2 e9 d8 x
}
; v8 X+ W' W- j, M Y. a* a
2 ?, w y9 S7 C/ }: e; [ power(yiDuanShuJu_LowMean, dv0);2 q7 x( Q/ O2 I
) B, o& z* k( b# P" i& Z int_sum_dv0 = (int) sum(dv0);
# c, L" g. @# g4 ~$ h% e; j( e/ m0 `0 ]
UARTPutc('B');5 p" h6 ~( e5 W) m/ I* B# ^: t9 V
UARTPutNum(int_sum_dv0);: v6 `% s x( L$ Y
UARTPutc('\r');$ \; M( X, ] d
UARTPutc('\n');
. P) z. u) {4 |8 Q5 I
2 Z5 M) i9 R6 E7 r8 W// int compareFlag = int_sum_dv0 > 1.0E+8; i- {$ n- J# q" j6 R% i6 z
/ O8 i/ q9 {. i+ y1 x* K
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
+ {& h$ Q7 H0 ?7 z UARTPutc('C');
3 @) H' x; E' k5 k /* 比较信号能量 */- i7 w1 l6 F+ M/ O( S: m$ ^3 A
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */) x6 N6 B, A1 C, e& Q
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
: H3 ~2 o7 Z4 \// for (ixstart = 0; ixstart < 1000; ixstart++) {% D+ v, Q L0 P5 B
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =" E C: Q( m. y W
// yiDuanShuJu_LowMean[ixstart];9 I) K9 x6 F! F7 v, W" L
// }
! s: r( k0 q4 c7 P% d+ u//2 i4 w' l6 Y0 b( l
// youxiao_k++;
, n7 P$ m0 u% A5 W1 h; c: v// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==5 g' `* O+ b0 [5 [! T% O
// /* 感觉要取21个数,即0-20, */% Y$ k: u- }: Y* C9 O3 q
// enough_data = 10;//有效是10,无效是0
1 Q4 w* H: _+ s4 d: V' `1 N// }! f2 _2 w2 M& C
}
; \: t, i7 e2 N, k9 v6 U/ j1 y6 _2 n. U# D5 Q# E3 U2 ]
1 }2 N w. [: g6 W1 A; j
enoughDataFlag = 100;& t7 M9 z4 O5 i4 \( _+ J! L
enoughDataFlag = 1000;
- o* S: w7 Q6 y% t enoughDataFlag = 0x02;
' m; }7 b) B( u+ k2 s. S( F' _ i( W enoughDataFlag = 200;8 ?& }' @$ c i' k2 N+ I2 _0 I
% l% T, D! B |7 F0 R7 w h, @
int myfuvk1;0 s( b0 H" Y6 Q S7 X$ _; v+ Y
myfuvk1 =11;
- E! O6 [9 B- K# E6 l
; b% o4 q- b1 ^) U: V' E# ~
) `! B' P% }. ^: k6 e; L5 o enough_data = 0;+ }6 K5 M' J' r) |: \, ]7 g2 I
% F. @1 k' x( v4 X: [) p( X2 Z, R// if(enough_data>50){. K& n9 ~+ q4 h4 [0 |
// enoughDataFlag=0x01;
9 ^; y( X8 H' n- A% h7 h8 A6 s// }else if(enough_data<50){1 ^2 E# d; f9 g! X. T( i
// enoughDataFlag=0x00;//0x00还是不行
; N8 f# e5 `# j; g6 B: B// }. z- C& C8 A6 d* E) `
" I$ r. e9 p! i: H& p
0 l! a- I$ R' H; E$ z1 d
oo=10; a" J2 m1 h+ m7 l7 b% {
oo = oo < 5;
$ B" _3 q8 i3 x. Z& Z+ T if(oo){
) ]6 K+ @, }1 w: O ii=0;! g7 J0 p. J. X4 C' U
}' Q, u$ h {# |% d3 B6 C' i9 Z. a6 F
if(oo < 5){
$ T/ [; U5 W8 t E ii=0;
0 f4 W; X8 D) b6 s; y1 Y }2 } D- k* N# ]' t7 L
if(oo > 5){
$ c+ W- M$ p( {8 Z3 m ii=0;' f. E9 V. X" ~2 F) J
}- U6 V2 N' ?. i9 x/ ]
) ?& L2 S; x* i( M" p
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
( _% e0 {" C4 i# t x5 [7 M /* 如果数据足够才执行主程序 */ T4 e- P. G6 |2 T, M2 i
oo = oo < 5;. d, Y& e7 e& I6 B
enoughDataFlag = enoughDataFlag < 5;+ ? c9 E8 M9 g2 m' [3 T" O
if (enoughDataFlag < 5) {$ d2 m) ^2 l$ Q! P( Z. e
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
4 h, ]* T# z0 t8 t1 |) Y8 ` AGC_AGC(&pAGC);$ v! U% y9 {0 v. i
3 s3 Y2 X9 M5 P5 z: b" H
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);! H# B! G; S8 E5 N# w5 Z
FIRDecimator_FIRDecimator(&pRxFilter);. h2 a; H" M5 s1 f- z
) M# t" l8 M, S3 G( d6 i
/* Downsampling */: a1 W9 i1 q" z+ `
c_SymbolSynchronizer_SymbolSync(&pTimingRec);$ f6 [; H5 v6 N# A/ u
/ x! w w# i' K7 ^: b( h6 c* D; n c_PreambleDetector_PreambleDete(&pPrbDet);
* v) ?5 \3 j. i: v$ ?2 h: X* f8 r! |" k
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
1 I: n5 k( l* x' X4 c; } /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */4 y9 p4 o7 j; n2 x& n6 U S$ y
/* %帧数量=100 */
* J# z" n7 F# S5 a pFrameSync.isInitialized = 0;% X( j/ I8 ^! L" }% Q
" `' d" I- w2 F& o" w5 k3 G
/* [EOF] */0 L0 c7 S. l n5 N, c2 } {
/* 前导码长度是13 */! m* {& z5 s+ x+ y6 Z& E! m7 E
/* %qpsk */, B( D& R6 d/ v4 y7 D
pDataDecod.isInitialized = 0;+ }2 \, T' S. C: C% T* D' S
0 Y8 X$ [6 f! Y3 R /* end */- K1 J' _0 u# R- i; [8 G+ z7 T
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */" M J" B, I, o/ l- O5 f
/* Convert 3-dB frequency */7 q; k& ^; u; _) b
/* Convert 3-dB frequency */4 B' f' V$ D* x; H% Z
filtfilt(save_buffer, usable_left_filtfilt);
2 {# s4 C+ _8 x! E! r8 g, O2 K for (ixstart = 0; ixstart < 81000; ixstart++) {
5 J5 z. H7 l" e, m% x T( W usable_left_filtfilt[ixstart] *= 2.0;
$ @" i: v( o! O+ J3 @9 L7 N; B }8 s2 K1 z l/ M
" @" h8 S, m% ~5 w9 D* F8 m+ V /* 注意乘2,处理幅度 */
" y) a) e7 `, h% Z9 V /* %% 我发现带通之后其实就均值为0了,不用这一步了 */' P$ H: c* M% i$ e9 C! V! h( f" {$ ] [
/* %% 行列转换 */9 l, o& u. J# ^9 q1 x0 V
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);" N {) Q/ k7 `" K1 m
for (ixstart = 0; ixstart < 81000; ixstart++) { m: y6 o7 ?7 H/ y8 h3 J& h, U
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]. c; ~* Z$ p7 G: C; O) R' m7 D
- yiDuanShuJu_mean;
9 f) {, Z$ K9 X. I2 B& a; ]! E }. N( C- g- P+ L9 X$ E; h
, N2 x; Z+ d( O( q- ~1 s- b3 ]% h /* %% 应该对数据归一化,但是这一步放在哪比较好 */7 e; X$ c, @! C: a7 n
ixstart = 1;3 R& r4 v; T. A( U9 U: J/ `% \7 i( y
mtmp = youXiaoShuJu_QuZhiLiu[0];! c3 S- F+ n4 g: d
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {, q$ X9 m0 \" ^. c; H
ix = 2;9 L7 u% W) l1 n. H6 }% S
exitg2 = false;7 V/ s3 F) ]* J- N
while ((!exitg2) && (ix < 81001)) {) w: X6 o+ W3 I: u8 N/ B/ h1 A6 \
ixstart = ix;
& Q3 p4 R: |* r; K; T0 @( ^" u7 e if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
+ ^! z$ ~% \$ @ mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];* c( ~$ i/ a+ k' T3 t: X( v
exitg2 = true;
3 u& E( F& j, r/ w; u } else {
. F3 F% `8 C& R3 r1 ` ix++;
2 a8 P8 Y7 I" U- e: L7 y }
- g) |- C2 o0 x6 k0 { }' v3 d4 P9 Z- W1 Q# D: r' T7 T$ [ W
}
: D5 U" J8 v! b! r6 u2 K1 t$ i5 u5 V0 k& H" M6 f' K" [9 ]6 E1 e
if (ixstart < 81000) {
0 ?# Q. h Q( u5 i' ? while (ixstart + 1 < 81001) {3 M" I# @' P' ^# V* U; X
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {3 Z- j4 w; e* g: E6 o
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];5 X8 r6 N) z- y$ V, y
}
; x" w8 C Z& L& T R8 M# e0 }! _1 i: Y5 z5 F
ixstart++;
: r4 Z3 F* W! A) G6 `' G }3 e f _$ s. u
}3 K: R. u' A, l) k8 ?$ K
& y0 n% U$ c- }- R- K3 _
ixstart = 1;
9 m7 @/ Q) F3 X F1 @ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];1 Q9 v5 U4 Q* B9 Y8 \
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
/ }! Y( R: _% ]1 ]2 a ix = 2;1 s& f5 b# F4 D& x, B2 O: E
exitg1 = false;
. t0 ?* U2 j9 p- _- k" v# o while ((!exitg1) && (ix < 81001)) {
5 E: X: }4 X2 H' M( Z; t ixstart = ix;+ h% Q% S! ^7 ^3 {5 s; h
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
! B& E% M4 Z: S; Y6 d yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];/ l2 F6 N# R5 r# E9 N% `9 S# t
exitg1 = true; b% Y" I& S" }8 z6 C( U
} else {* Z3 u! o3 ^" C. x0 {( S6 U" V
ix++;
6 j, D9 X# v8 i* d: {; ~ }
' g& m& R u7 I/ P6 a' i5 G; d J0 Q3 Z }+ m, o, r1 I Q Z# g; [- b
}
0 N5 d, G8 Z6 `' f8 r' d3 b1 L! d! t
& n4 r: E4 A4 e$ v; P if (ixstart < 81000) {
4 B' s7 P- n, ^% E2 Y% S while (ixstart + 1 < 81001) {1 \7 N9 b2 G- P8 i, w
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
W6 h, D/ n& _4 t7 i yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
/ S* C2 ]$ S& I3 { }* B+ F/ k N$ Q
6 z4 l8 R9 F- E8 d ixstart++;
0 f. ]. I! {5 a t! s }
7 @8 Q$ F# j" l/ N5 _$ w }
& {9 R8 w, M4 i8 g! p ^3 _8 u4 W" l3 C$ U* B% S( y5 y
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
; r2 N& M* Q+ S3 n& n& o& F" C if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
) K3 k: C4 x" c yiDuanShuJu_mean = mtmp;$ R6 C: B( s$ R' N o: P
}" ~) ?, y i" L4 n1 ? c6 S
7 O" J3 F8 E }5 s$ r6 `! m /* 找出极值 */
4 w- C% ~+ Y2 R z ?0 f d | for (ixstart = 0; ixstart < 81000; ixstart++) {+ z @: Y& Z2 o. p4 p( J
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
8 R- e3 x0 G0 Y* D2 f; g }
0 N& W. H! F+ O! X6 L4 C6 }- E& ]3 R- ~' k
--------------帖子字数限制------------------
2 h! {0 ^$ e( {! e}7 H8 s- |. _1 z. }4 m2 X1 F
. O5 G g+ r5 w n
" h0 F @% \' A' S$ b |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|