|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
( [0 G0 u. [, U4 R% I/ c1 B
' b4 o X8 x; @" a( E# l各位大神:
. s: |, l6 K3 d# ^. A. @ 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)( q% U) l9 r0 O; Y) g0 o+ p \7 t
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:. f5 u" m7 e0 e# Z9 K
6 U; g. r5 n2 g( x
5 \, ?; m i- N8 X1 t! N
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。" E) S& p/ g) ? s C# I [/ v
7 z0 o' N* E# Y# P2 L9 w( j- E: X并没有其他线程! z' l. X! b4 Y& A
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。5 {- B9 V* x) u5 r9 `& P
也说不定是和堆栈有关系。。。。。。( v/ X$ i' @ L( u) t2 v0 S. T" c
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....' d2 L; |; u8 T0 N, e- [, A! v
8 ]5 `; @7 I" b* u( M) s
" Z, k* D/ n! U/ z& M9 S2 p2 a3 [ m$ U9 c7 i, H% k5 M
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
9 e/ }; I( c: l0 f+ r$ x; z' N2 |6 s6 S P( L
5 g6 i5 p/ k% o/ o附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
' T( p- p, z/ l& {8 ` static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
% }0 {; g5 @$ ?- ?/ f; p% b! w* k- K7 B
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(8 i+ O! x/ `" V0 L8 q
const double data1000[1000]) {
; ?9 n6 J% W$ n7 }4 N1 @
& R Q1 i3 [& u; ^8 A6 o3 \. R int myfuck;
. t* L) S O6 S! o. t/ e double yiDuanShuJu_mean;& }' i3 G. X5 j& F8 l" e
double yiDuanShuJu_LowMean[1000];8 H2 q( K$ w7 N8 r8 [8 {
int ixstart;
/ C. c- |% _3 o2 ~# e double dv0[1000];
+ H$ e( r/ @ H8 }2 U) ~ comm_AGC pAGC;
2 x7 Z$ R# N4 `0 P& V comm_CarrierSynchronizer pFineFreqCompensator;
8 R. C5 S5 F! m2 H dspcodegen_FIRDecimator pRxFilter; N0 i5 D! X0 W; V- q8 Y$ Q
comm_SymbolSynchronizer pTimingRec;: I0 W( \$ b9 u# X
comm_PreambleDetector pPrbDet;$ A7 e: _. A0 T! b- Y" U! a' X
FrameSynchronizer pFrameSync;
& S5 V" J1 R; \3 c: c# \* s QPSKDataDecoder pDataDecod;
3 B( ?0 `3 _" h0 X/ ^* ? static double usable_left_filtfilt[81000];" P1 ~" t- [3 w+ W9 G
static double youXiaoShuJu_QuZhiLiu[81000];" {8 @; }$ |& {* w6 T w
double mtmp;7 x4 }4 M' r: `- P9 T; q
int ix;
$ D2 q3 e/ q# X6 \ boolean_T exitg2;
4 J5 a( w. A% {8 `5 K' \/ W boolean_T exitg1;
) e# t/ m! R' a, |- a+ f+ C0 M- t8 u double YiZhenShuJu[800];" X- K4 Q* m) H9 z& q% n2 \
double dv1[800];
! X- b. f( f# O. h3 |4 r* X. ?5 S" ?( b* X/ C
2 l; U1 x5 ~3 x7 u
double b_YiZhenShuJu[800];/ _% w7 o* ~+ l1 `
double I_filtfilt[800];
1 w% \& H6 O D- O/ H1 ` double Q_filtfilt[800];% W& s3 b! {' d! q5 [
creal_T b_I_filtfilt[800];% B5 E1 _! k# f7 E8 z u
creal_T b[800];
% Y$ \5 ~/ t9 u8 q2 S% [( ] creal_T RCRxSignal[50];
: \9 B3 W" n$ d( f- w0 c7 p4 P creal_T fineCompSignal[50];
* k2 I. R( `: H; i3 M, R: S double phError[50];
- n: p" w. [0 f3 [) j/ a- E1 d creal_T timingRecSignal_data[28];* h" |6 m$ J* d8 L) J) \
int timingRecSignal_size[1];
# Z' [% y+ |7 _8 c, C double prbIdx_data[28];1 g+ s- \6 `; D+ |$ _
int prbIdx_size[1];
* P: }% z$ g$ k$ y' E double dtMt_data[28];
; ~9 D& N+ Q6 X9 d4 p* U int dtMt_size[1];5 V9 d/ O2 N5 j4 n) R) ^6 W/ g
creal_T symFrame[25];/ y* t8 _* ~- U
boolean_T isFrameValid;
/ y7 p7 ~3 v3 D7 } C* c0 C double unusedU0[3];( q/ q4 Z+ o. Z% T- V Q$ F' a
4 R' T4 A/ J9 ?7 {) ~% E //调试过程中的变量1 o7 d1 {% p4 H6 L) B* @ M
int enough_data;* \3 c. ^- B2 b+ Q' x3 V9 r
3 Y4 z, m& T( I* G3 A8 W0 ]( r
int enoughDataFlag;! s3 {* I3 b n+ ]6 B7 O
int yiDuanShuJu_mean_int;
$ e+ Z7 b" i( d% L) J# r int int_sum_dv0;
1 A- f3 b; J, c1 E6 s int oo;
' y& g6 O* \2 V int ii;4 v5 q* w3 @, v3 D b6 V- b$ i
myfuck=10;
+ u3 w# S }% ]1 t' X /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */& E% [- x' A3 p! k
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */3 b+ k9 Q) l0 x5 F0 n+ `
& c) T# w' N% {2 B yiDuanShuJu_mean = mean(data1000);! A# h- K# b; i; z" F
2 \: i3 [, i9 ] yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
! A7 l5 D6 I0 \( }, w# L: B UARTPutc('A');
, ~4 M1 h) m& { UARTPutNum(yiDuanShuJu_mean_int);7 Q: G$ g; P- U2 d' T
UARTPutc('\r');6 z0 r6 l' x o$ q% }
UARTPutc('\n');
, N2 _- f: l1 Y' H$ O& B- [% A
( y. T) T: K0 ~% D! z# y x for (ixstart = 0; ixstart < 1000; ixstart++) {$ D% S' Y& o0 G! n2 P
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;) X7 q' [( u1 M: A% ]/ R! X
}
/ O: ?' O# O7 O1 y G: ?! ]
+ c4 k2 j# P6 ] power(yiDuanShuJu_LowMean, dv0);3 Y; s; Z9 e8 q& G. f2 G) U4 }0 J8 c
% i( I4 i1 g6 G$ J3 C
int_sum_dv0 = (int) sum(dv0);% z9 M9 p g6 h4 l/ R: V; P
, `) g( x) j; a) P, W UARTPutc('B');$ f3 `( O" R1 h2 s
UARTPutNum(int_sum_dv0);
3 `" x |! Q3 N+ _8 r+ Z UARTPutc('\r');+ U. D! ?6 X/ T( O6 r% S
UARTPutc('\n');: n/ b# j7 M1 R2 t
+ X9 @9 p+ V# f' m+ t" M- ]5 V5 w) u
// int compareFlag = int_sum_dv0 > 1.0E+8;
+ X9 @( i% p' D
( u6 Q7 G8 _+ t7 a/ ~1 |8 X if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?. }$ |( F% {1 A
UARTPutc('C');8 a& ] P4 J% L% S6 o9 \$ N: S
/* 比较信号能量 */
" z& X. ^& A2 l& o5 p /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */9 s7 h" \. t8 e: o& c# z
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
; m8 P9 Z- z; _2 ^; c3 f m# i1 n- P- z9 C// for (ixstart = 0; ixstart < 1000; ixstart++) {/ h9 @. S7 x+ O! X* Q7 \
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) x2 I& F. Z5 S; T- P' A$ e2 s// yiDuanShuJu_LowMean[ixstart];/ Y! J- \8 {" u# F5 ?8 f$ h
// }
% z# d+ p. ^0 s( X//; u9 P. d! m8 }; h- k- J1 X
// youxiao_k++;% Z I* c: F8 z( g' F# Y( i
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==3 v8 i" v$ B* j: F9 M6 e# E% m
// /* 感觉要取21个数,即0-20, */$ t' A' d' ?4 w( y% |9 W" X1 J7 p
// enough_data = 10;//有效是10,无效是0
2 H$ Q$ N4 N: l: W// }9 Y1 x# b$ R, f$ y# G
}
* V- ]1 _: z: U
' F3 a# g' X% ~" F4 r4 k+ w+ n! [$ g) M+ q4 f7 l- \# `8 m6 R2 a$ O" r% b9 c
enoughDataFlag = 100;9 w/ x8 I9 R, Q2 |& p/ l* u+ r
enoughDataFlag = 1000;
# ^ A" b* K3 d* O enoughDataFlag = 0x02;
1 G. j- x7 S" d! }4 ^ enoughDataFlag = 200;, D% G+ g% I9 ~/ x0 ]
& ]" I5 q' B' Y. Y, C
int myfuvk1;1 A7 |: T Y1 u# F" T, f0 L
myfuvk1 =11;
: C# ^8 K$ C2 O: `, ^, ]: r0 L
6 L% o( Y% h! @. B E& f4 B1 Z H! y- E# j1 H2 ^
enough_data = 0;* W6 S% D- ^, [5 e
+ r1 x) E' l4 B; S' G
// if(enough_data>50){8 v1 @" l# s. Y* ^9 a! ]; |/ S0 m
// enoughDataFlag=0x01;
( m4 G. K3 [! O// }else if(enough_data<50){0 S1 Y9 j: i) _+ }6 q
// enoughDataFlag=0x00;//0x00还是不行1 a/ U7 Q# {/ t/ |7 w8 d% y
// }
1 g! w1 F/ c( @3 q, |* `" Q
R- g/ \8 v0 W8 f8 u) g8 }; ]; s3 E# ^& }5 E# a
oo=10;
# T0 R3 l. w9 F1 Q! I oo = oo < 5;0 {% E$ a/ P2 |6 }/ D6 p
if(oo){
3 Z2 N5 m! d7 P0 m5 Z: o ii=0;
; B8 E5 T' y1 F }4 t i0 t8 S! I+ X0 |8 \ G/ l: M3 m
if(oo < 5){+ K" E" h" B( s+ X( U
ii=0;1 w% l7 i7 ?/ S5 d3 x" N+ r
}2 ^7 e" C8 O$ @7 a9 f/ Y0 B0 R4 D+ T
if(oo > 5){
& Q, ~1 z; w5 t [: \ ii=0;
' E* q9 t5 d- M" G1 ]5 o }
. n1 f% @ D2 `4 W/ U; k% R+ V% m2 T9 v; Y% d
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
/ t& y, B# l5 x. E" j- b /* 如果数据足够才执行主程序 */
& N$ G; _1 a6 c" W' q/ P oo = oo < 5;+ W* f6 f- l8 T; V* u7 c3 W
enoughDataFlag = enoughDataFlag < 5;
$ M8 ^+ r& | @2 k* l5 d" P0 S if (enoughDataFlag < 5) {+ C2 s- |! K( i
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
! A; a( A7 P2 X4 @9 y AGC_AGC(&pAGC);: o, V/ r( E; v5 I9 ?
# Y3 v) S* V- n# m0 N# }4 G c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
$ _! c* q% u- G5 I" K FIRDecimator_FIRDecimator(&pRxFilter);& P; y" M2 O/ T) a5 |4 U
1 z; P4 [9 C6 h# Y1 y6 @" | /* Downsampling */, M) Q9 s$ A! z8 U' p$ ]
c_SymbolSynchronizer_SymbolSync(&pTimingRec);' S3 z, a8 z( N0 T1 \' \
. j1 m( S+ V5 ^0 g; c, Y
c_PreambleDetector_PreambleDete(&pPrbDet);) d1 B/ S- {$ M" b- u4 B5 g
9 v% U' M8 y3 K /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
; \2 R* c" ^* ] /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */1 m. U6 N7 }* s
/* %帧数量=100 */8 F T8 H' @& E' {! T! {2 g+ R L. L
pFrameSync.isInitialized = 0;
) o4 C5 t! D8 m' e
1 L R, t% {3 o' ]. O9 a /* [EOF] */
" Z' V" r: ?; u- r /* 前导码长度是13 */. j; T/ V* a$ U6 o/ X7 r* C
/* %qpsk */
- j( ?' z) u# m$ Q pDataDecod.isInitialized = 0;
, _7 e' }# O# z: G. e' v* L" r5 S/ G, x7 T' P
/* end */
4 y7 i) M) _7 L8 t& c4 W W4 { /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */- c* G& _9 Y+ g* y7 r1 X! s
/* Convert 3-dB frequency */
( W4 W& `6 e) L3 c8 }7 h; ` /* Convert 3-dB frequency */
1 z; o( A5 L* Q. Q6 P+ ~6 R _! C! U- z filtfilt(save_buffer, usable_left_filtfilt);
; D" i7 b0 e! B" T for (ixstart = 0; ixstart < 81000; ixstart++) { ]+ b* H! `' m7 v5 P; l
usable_left_filtfilt[ixstart] *= 2.0;
1 y E: _" ^) B }$ S7 [& s O' ?2 [% T
1 }6 L9 ~3 h! t, A2 T P
/* 注意乘2,处理幅度 */8 k1 Q6 y& r/ j
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */8 c4 S2 a' {( k8 R5 H7 F" u: ~! j8 c8 b
/* %% 行列转换 */
% I4 t3 U( r; S p. ~, n yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
# m8 G% I5 P& T" _" \/ ^; f for (ixstart = 0; ixstart < 81000; ixstart++) {2 a0 g f0 X! d
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]* b& W) d2 A6 N; `1 A j
- yiDuanShuJu_mean;, Y; U' U9 r9 ]# a2 v$ B V
}3 ^" H! Q0 ^7 z! b/ C
% p4 ^! S" m: t$ S3 I5 k+ S/ Z
/* %% 应该对数据归一化,但是这一步放在哪比较好 */, g5 X9 k3 ?( [' y/ `! u' V
ixstart = 1;
' T7 _2 |9 Z/ R3 o4 @3 Z2 R! w mtmp = youXiaoShuJu_QuZhiLiu[0];" J5 @$ N4 p" {9 j) n, j
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 {3 U' h. D( R- r
ix = 2;# _ n" Q( w( U; e
exitg2 = false;
3 g' h* j/ R: F0 x8 f0 O. \2 [/ d while ((!exitg2) && (ix < 81001)) {
3 Y9 ^! h' i! Z5 X ixstart = ix;9 _5 b7 s: u2 h3 u. c
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {; s8 t3 X) j, {- B
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
) C& d4 o+ t% r2 A* }' k exitg2 = true;1 Z0 W% B1 B. M+ [
} else {: l" Q4 g5 Q' \, K
ix++;* D# B9 x2 V" d9 I
}/ Y5 K9 ` [/ H; ~+ I; b+ ~) {
}
8 f. Z9 W b9 v. ?7 N! k$ ~ }% {% N p1 i f9 d! n. Q, n
5 u& s* I) n0 p9 Y1 ~) B
if (ixstart < 81000) {
1 o* t4 j/ Q/ S, z: n while (ixstart + 1 < 81001) {
2 w6 O s4 o3 H1 d# |" c" H5 b if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( I& _# ]) z; L/ M1 e3 ? mtmp = youXiaoShuJu_QuZhiLiu[ixstart];' b* J7 o0 e+ H" X" p
}
( T( h& C7 c0 o( x) v* Q2 u f/ A$ [! \
ixstart++;0 D2 F2 O+ h7 \+ E1 a
}
$ D+ V9 a$ ]7 E+ { }
\ e6 d* s5 K( ?
' R6 R z3 x1 z0 K( P1 D7 r' w* u ixstart = 1;1 C' D- K6 C7 j4 _ s, N" P3 \3 Z
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
1 x$ D/ J8 H" E' W3 o if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
4 {, u4 R# r1 c& | ix = 2;; O$ r6 z8 F6 c
exitg1 = false;7 u& }7 o; D& n5 _5 T
while ((!exitg1) && (ix < 81001)) {- K5 U! |% Y1 F: P) V7 h
ixstart = ix;
& M* U+ `6 r- ^1 v. t: [4 G if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. @' F" }7 l8 K6 P7 P' j6 E
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
% t* |7 e8 x' P" K& z- T exitg1 = true;5 Y! {1 |' L3 e: q
} else {" E$ _8 e* [9 P# Q* C. H8 Y" S( R
ix++;
! r6 z9 `. u" A+ l }$ q1 t: y1 I$ m3 T3 O
}. Y) S9 R% Z0 t
}& y4 h1 M% L" x0 R) y+ {& d
- ]& ^/ E7 Q( p+ ]
if (ixstart < 81000) {- p, Q; A3 q) t- u4 t% o. P
while (ixstart + 1 < 81001) {
$ s7 ?) {7 N/ R2 B ]0 B3 \ if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 K7 O) j- k4 g& ]& Y6 f$ o; X
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
: n; U* Q6 m l& I# H; K7 h }9 G D9 G; I6 G$ w" U
6 r( m6 c( G- c( j ixstart++;
, Y' t' c- H% P2 r5 g }0 y/ q# I0 h! ~$ ?6 \, [
}; H) i0 C U$ {1 R! E7 D- Q
& Z" ^& B$ y* Y8 B1 g; B
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
8 D* u9 f/ J8 E1 T- X, r9 R if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
0 A: f! j" W+ S yiDuanShuJu_mean = mtmp;
. i) l4 ] z1 Y$ W! O5 r: B }
$ ]* u2 s' C- C. t# M9 ~, Z
. U$ j. f p1 ?1 {1 e9 g* S% d /* 找出极值 */
: N% H8 l4 _5 T/ r, k9 l- Z for (ixstart = 0; ixstart < 81000; ixstart++) {
& c+ y2 q8 i/ Q: u6 \: H youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;! b) d' C$ A2 E, _8 a- G, Y
}
5 |3 s1 \4 {# F
* K3 }; S) z) M( V! x( B --------------帖子字数限制------------------: E# ^+ n$ |) A+ M# S
}
1 D. C% L/ t7 v( C" V; R4 `( G: y7 b: }! b# n+ P$ i
7 R' ?; |6 S' H- r: Q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|