|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 : }& J2 P. `; s K4 g
' _. K. K( b- \7 V
各位大神:4 U; M9 i7 A9 ]% S: @, x, t
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
6 o" B, j8 e6 I1 }: J7 Q& t 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
2 ]& r. P8 K# r0 W
/ k! m# ~! i0 R# Z 3 Z; c0 i, r4 u% B4 u3 m6 V
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。2 [/ s/ T1 r3 s0 |& j) ]1 s }
$ z! o5 S! }2 \并没有其他线程/ x3 m+ ]! W1 `, c
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
6 s j! V3 ?# i# z$ K也说不定是和堆栈有关系。。。。。。
0 V: [$ A$ o% {& z请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....% H8 E* {! o/ X; i( I
/ g1 C; g. W% \; x" G
/ J$ ?6 J2 ~) O/ f8 z
& n6 ?: {' Q% S4 @! [9 u我也很绝望啊,希望大神能帮帮忙,感激不尽,!$ _+ H, }( ?+ V a2 f. j' K, ~ k
4 o* O7 t$ M, V( d! y# z- O
- t* ^& d& f; x& d, c
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
( G- ^: N5 G! v static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。0 V/ {- \* b! {) L; B1 p1 D9 O
' t, ?* q& ~0 J2 U# x$ Uboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(1 G9 B |# Y2 J! W- [' u: ?: {
const double data1000[1000]) {
$ D: ^$ u' d5 m f$ S& f6 R( K+ Y2 ? T. p3 |6 R, `
int myfuck;5 a6 d E, ?7 S' U
double yiDuanShuJu_mean;6 `# x! {& A( c) F+ E
double yiDuanShuJu_LowMean[1000];: h# E) v. D5 ], h, N; \6 s5 f
int ixstart;+ I: ?) t0 P+ m
double dv0[1000];
$ c) K' @* p& S5 [ | comm_AGC pAGC;9 _% l' ?5 c! t( ~* j( D2 ?
comm_CarrierSynchronizer pFineFreqCompensator;" X- S$ Z5 V+ v# e" r. t
dspcodegen_FIRDecimator pRxFilter;$ G0 x# J. b3 a9 K9 H9 @
comm_SymbolSynchronizer pTimingRec;
% ^$ |+ J6 X! y/ F comm_PreambleDetector pPrbDet;
' Q; w/ h) i$ L* e7 m; e1 V) X FrameSynchronizer pFrameSync;, n, N! J$ ?9 [% d1 r T
QPSKDataDecoder pDataDecod;, t9 e: M# @+ g6 h2 P
static double usable_left_filtfilt[81000];4 o7 p' d2 ^0 K2 D# L4 L2 V2 c0 S
static double youXiaoShuJu_QuZhiLiu[81000];
& |; [6 `$ E s3 ^ double mtmp;
. |( O4 |7 v1 L! g& [ int ix;. b2 r I2 q( n A* ^$ Y
boolean_T exitg2;/ k# c6 k- G, ?9 g# q+ F& T' d
boolean_T exitg1;. i" \3 ?* b, T
double YiZhenShuJu[800];) b$ z: B( C* o. q- S4 z/ `- K
double dv1[800];
* J7 m" t% ?$ v$ C7 r9 d9 w8 i
# _1 y9 _4 z/ F4 ~. _6 z+ t* X4 W% J# p7 i. m+ w6 N
double b_YiZhenShuJu[800];" r4 Z( p2 l# h8 M8 L: Y7 T
double I_filtfilt[800];
2 C% w4 P; t8 f* u# e! a double Q_filtfilt[800];1 Y4 R) w. D6 K# [6 w
creal_T b_I_filtfilt[800];
& Y+ m: O9 V9 [7 W3 \ creal_T b[800];. @. x6 i. V$ p" T' W+ ^6 Q
creal_T RCRxSignal[50];
& H5 Y2 d% w5 ?4 H' X creal_T fineCompSignal[50]; L$ u5 K. ]' A& \' O
double phError[50];
' j9 X' n& r* }7 n8 C" h+ B6 G6 W1 H creal_T timingRecSignal_data[28];
1 P& m' _5 U+ i9 C" f) @; G0 T; ? int timingRecSignal_size[1];
& C. k, [8 Q4 h& C! K! q- K- g double prbIdx_data[28]; h1 h3 X6 n# [3 X2 z, O8 L4 ]
int prbIdx_size[1];
# M& I! x* k N$ L+ J$ Z double dtMt_data[28];3 ]# X+ Z6 M$ R$ d: B6 W3 W' v
int dtMt_size[1];
& c. |0 H) U. j- ]7 z0 | creal_T symFrame[25];, O$ |; h6 t# r2 J8 \
boolean_T isFrameValid;+ j9 I* i! y% A" s B
double unusedU0[3];5 L& u ?5 K8 i, O" j
4 t0 z9 H# w6 b: D' N' T7 I* E //调试过程中的变量
* S3 H) O l% d1 A+ a& p int enough_data;
( y9 W6 S, l2 p* g0 _" a5 X- H1 y0 j2 V# U3 R# Z9 T1 a$ `0 C" e) O# w
int enoughDataFlag;
) {4 j6 U8 \% r6 U: x) O& q0 l+ [ }" S int yiDuanShuJu_mean_int;
! |6 |' I- h/ w& j* y2 \% C O8 q int int_sum_dv0;2 g( c- W1 a5 \" A2 s: O
int oo;
! }- z; Q3 j& p1 F9 c& x int ii;9 [+ \- l3 d& h& b
myfuck=10;/ r7 Y3 ^- G! c* R
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */+ {4 j& N0 j7 c
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
6 t1 y# v7 T1 u) d, {2 A7 l2 r! g3 p4 G; M4 @
yiDuanShuJu_mean = mean(data1000);0 r3 P" k U* x) z9 [
7 [8 z; v7 S: B+ r
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;8 N, z C' }8 x( l# B! h
UARTPutc('A');
7 ]1 ]' H9 y6 J- s4 S$ {8 o, O UARTPutNum(yiDuanShuJu_mean_int);* K* _1 ]% x M+ ^8 S9 j
UARTPutc('\r');1 E; r2 Q2 L" f8 R
UARTPutc('\n');
/ D! d6 n. B ?( N* k0 E" Y( c) _- X6 o
for (ixstart = 0; ixstart < 1000; ixstart++) {
1 L. g. A/ M) r yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
* ]2 w3 k# d2 \" V- @+ K. H. h }' b! l* _' x, Y8 T# ]3 |
# m( V4 l$ n3 F+ X9 s: l Z+ M
power(yiDuanShuJu_LowMean, dv0);, O6 R) X/ h7 `- o0 A
6 S* ?3 `0 j% Z* R- M0 K
int_sum_dv0 = (int) sum(dv0);
( v; E2 \' i) x4 R0 O. i1 q: v
$ F( z4 ^5 L E* B3 g0 g( Q+ p UARTPutc('B');+ ^) H* r* o' o6 h: t0 Z# Y+ G
UARTPutNum(int_sum_dv0);
- f C6 ?! {/ S: P UARTPutc('\r');
# R& {- N, S! O: {, k5 m3 P1 l UARTPutc('\n');
1 A p; Z$ s& x- s1 z$ Y$ v1 _9 Q' W% f) ]+ g, e- [
// int compareFlag = int_sum_dv0 > 1.0E+8;
" G0 ]9 S/ w8 g7 o1 c% k, Q( r
4 @+ I/ l7 x# x- ~5 ~% Z if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
6 W- D8 D3 T9 H9 e% M UARTPutc('C');
1 U, n3 a4 r- R/ S5 h' w2 [ /* 比较信号能量 */
0 P9 H$ q- X/ X w /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
+ @, L/ c4 F+ d0 G# ~- |: `// yiDuanShuJu_mean = 1000.0 * youxiao_k;2 H8 }$ X/ Z* V
// for (ixstart = 0; ixstart < 1000; ixstart++) {
! R" v2 _5 I/ n* o; U, X% A// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =# B+ Y2 q) ^9 w7 q- U8 Y
// yiDuanShuJu_LowMean[ixstart];: @; r6 D C" O% I$ ~' o
// }
) z" B1 ^. z" @& r( P Z# i//
3 i1 S' ^) z6 Z- S' c// youxiao_k++;" g+ N0 t: C2 O0 }
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
/ t( o+ R/ J8 U$ f, z; S4 [0 {# n0 L// /* 感觉要取21个数,即0-20, */2 l m( [- _8 p% Z0 W2 x
// enough_data = 10;//有效是10,无效是0
5 A* \) y8 K! x ^& F6 b" j4 l// }7 H: I3 v) i& v' V* u6 o/ }
}
y3 G* x7 N6 Q; K' V- _% w7 F7 r/ A! g, k
3 W' ?( }- A1 z, y$ a enoughDataFlag = 100;
% ^: }# B& G& \9 ]/ C/ X5 v+ Y enoughDataFlag = 1000;
) S- G$ R, S' m( R% r) ] enoughDataFlag = 0x02;
; V1 w, v/ {; i; ~" c& S g enoughDataFlag = 200;
; S9 l% \3 p" p% e, o, F9 Q j5 s- @" R! W. p
int myfuvk1;
( C! G5 p* ^. _$ c0 s, ]9 n% G myfuvk1 =11;
! ^% b$ X) x5 m
0 o( m9 ^$ r) h& b# i1 B3 t4 u$ R4 R$ y2 I
enough_data = 0;- t- T- g: r: k" Z7 H2 X2 c
& W2 \8 P3 W" w( {9 P* |// if(enough_data>50){
0 @) y8 ^( p5 l// enoughDataFlag=0x01;6 P; S7 X& Q* T9 r8 {& q0 x
// }else if(enough_data<50){
3 u* }7 ^% v+ n) q// enoughDataFlag=0x00;//0x00还是不行- @8 W0 V, y# r
// }
& e4 x" X; V' w0 t1 w# y- P( t1 w8 U2 S8 Q0 u: e" K
6 c4 }; r! S" O
oo=10;
+ N& |; {# Z) X oo = oo < 5;
, ^4 a. ^* s0 b9 H1 ~9 N+ B" l if(oo){
5 ~1 C) V! S3 w! d3 P' J ii=0;
5 E5 q/ Y+ Z ~6 r# m+ |7 o P }- [& m$ h8 H% b2 r" y8 K
if(oo < 5){
: c% P0 w" R9 H ii=0;
9 f# k+ `9 x5 i. B$ T }
" P( z% I F t6 |- d2 x# L; p if(oo > 5){
5 M' I/ F$ F( n7 x2 A ii=0;' Y0 d4 V C: I9 R; ~7 |8 T
}
* n3 J5 z0 E5 B0 M( W9 |& S+ {
6 A7 {# R. R3 x+ W* p' s7 }7 r5 _ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */! U) s9 S* j/ I' y2 k3 q
/* 如果数据足够才执行主程序 */
+ e) _( p; b) k+ v0 K oo = oo < 5;
; F3 x S9 {4 |$ O enoughDataFlag = enoughDataFlag < 5;1 D$ F; j. A% O& q! A6 M6 h# ~" T
if (enoughDataFlag < 5) {# O* W" e+ g: x; G
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是06 ~" _* ?8 t; L, w4 @0 g5 d* w
AGC_AGC(&pAGC);
: k* y5 ~+ N$ j/ M
# A% R. Y# `& \ c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);, o* G* D* X' T. x1 ~
FIRDecimator_FIRDecimator(&pRxFilter);
5 B* L7 n1 ]# ?
! B4 R7 k! D! Z4 X& |. e9 c /* Downsampling */
7 h+ ~) [! D" C7 n- N& S8 [ c_SymbolSynchronizer_SymbolSync(&pTimingRec);
0 x c: ]" d* [/ n8 \0 L) ^' }# O: T) ^4 ]! z
c_PreambleDetector_PreambleDete(&pPrbDet);
- i( k4 }5 R# u# z3 s
2 }6 `5 N3 ?0 l* K# F) s: _ /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
6 Q8 o: m S* D7 ^' W /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
& K) |, S) C0 h /* %帧数量=100 */+ Y: D4 I& {; Z
pFrameSync.isInitialized = 0;* y" X3 S; s9 T9 o7 Q3 t
# M0 O3 W) k! `3 O
/* [EOF] */3 N" w" N1 H2 Z5 G
/* 前导码长度是13 */
9 ?2 O! X, n& x /* %qpsk */1 w1 _6 B. K9 Y" I, X2 Z
pDataDecod.isInitialized = 0;8 k% P1 |! `; e2 n
" U5 w- B% X4 @
/* end */
! Q* J N* u* p' ]3 J0 n9 C /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */- E+ b* X8 o% K
/* Convert 3-dB frequency */( Y- c- W6 u; L' l: h/ O. A
/* Convert 3-dB frequency */
: l9 t$ C3 s6 e7 y, c' N filtfilt(save_buffer, usable_left_filtfilt);# T6 h& `) M) j$ t& ?5 X- C
for (ixstart = 0; ixstart < 81000; ixstart++) {
# N: o$ h L7 E- z3 E; Q, |" } usable_left_filtfilt[ixstart] *= 2.0;" c: |; o2 m4 O
}# \7 y+ u; E0 X6 A: L
" h+ y8 j3 R0 C' }
/* 注意乘2,处理幅度 */" p3 B1 Y1 U6 O/ K3 _: {) H
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
( M+ Q9 c/ @/ j0 k f5 w# i& I /* %% 行列转换 */
9 ^% l( h+ d% i9 Z* d yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 {1 a3 _0 j5 @6 g for (ixstart = 0; ixstart < 81000; ixstart++) {
5 ]' G! h# C8 P& L7 ~" Z' m7 [ youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]( r5 E6 K( A0 A$ [- n6 o
- yiDuanShuJu_mean;3 o$ W+ s# n1 J% E5 c
}3 K9 K2 v+ ?, g8 j3 P
! B! {' b$ @# V+ ^% Z8 u! e! t /* %% 应该对数据归一化,但是这一步放在哪比较好 */% l) x0 {0 t+ B! G- T# H, L N( _
ixstart = 1;
4 G- l! D. Z2 Q+ z8 Q9 U mtmp = youXiaoShuJu_QuZhiLiu[0];
' X6 C$ X# g! N: H if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {7 }* E$ h! o7 F4 { j1 @$ Z1 u
ix = 2;. N' N) T, {6 V- b
exitg2 = false;
1 ^, ~8 `; I8 y6 k c! y* G while ((!exitg2) && (ix < 81001)) {
% C3 W0 p6 M5 s, v+ Y4 s0 f ixstart = ix;) T% W' d/ t) s k$ C" J
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- n% r; Q y+ ^6 \+ ~, u9 j1 @
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];/ G9 m0 ~- A2 L X9 R1 O
exitg2 = true;
) [! y$ X7 W# r1 ]4 n } else {
. _' x4 k. F% o& W9 h ix++;' i, e+ t3 \ Q o
}0 A0 z7 y& A6 v% X9 Y) J
}
1 i4 ?9 ^; Q! Q8 G }5 z+ N* a0 r* `
, n1 v* j9 L! d
if (ixstart < 81000) {. K' ]3 P( x/ X3 o" s$ K+ j
while (ixstart + 1 < 81001) {$ p# k* s- p! g, N. O" f2 f, F! M
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
/ r/ [, [% }9 G* X# Y d' Y8 C mtmp = youXiaoShuJu_QuZhiLiu[ixstart];! R2 G: ~7 c( I% r, i+ O- Q+ V$ K
}
! L( B8 X1 O4 ?, F @& J9 Z9 Q6 c6 y4 v% `1 r
ixstart++;' U! |3 j; [' X8 A( \
}$ w$ Q3 \: P7 a U
}
1 R! U, \$ Z5 ]4 L+ e
' d; P# V. s$ b! T1 U9 W ixstart = 1;
# H& F6 t- ], {. s7 T$ s yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
7 I7 o5 L# S( r7 \3 g if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; C: N6 k8 J F) C- R
ix = 2;0 i/ R6 o% e4 O+ m- r: O
exitg1 = false;
: N# n- Q. x z6 | while ((!exitg1) && (ix < 81001)) {" C1 p4 x* u$ d3 C1 e$ u/ k
ixstart = ix;: F9 S( }- h# [! v
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& R& F. M% N# t( S/ M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 \: k, G( B+ j
exitg1 = true;) g$ H4 U/ I' _) c% e) f
} else {. E. F2 J& }0 E
ix++;2 p! T @* t; |, Z* g( |: _: |
}
' x& J" P, T! g0 _( s9 e4 V }/ G% r* f- Y! e3 b! b: _3 I
}1 t9 M& |& h9 Y, \0 h
2 r9 {& L" n: j6 |* ]! T
if (ixstart < 81000) {
) v% v4 @: N5 ` while (ixstart + 1 < 81001) {8 V# a9 [" N( @7 _' R3 G$ Y
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {5 C0 J1 K/ T$ v3 n; b
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];: R2 V& Z! p$ l$ {* D5 N
}
1 C* ~0 Q) _4 ~. k7 g4 J+ C/ Y/ @. w% j6 V, s3 Z' I" J
ixstart++;% @4 T. r" k+ R% f( v
}% C; |6 i3 }2 X5 o! ?
}, L d2 X' x7 q% d
" P" V: u' \) v g yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
" H& {) t3 x; ~: o if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {1 u# @! d2 ~% y8 i% X" v+ y
yiDuanShuJu_mean = mtmp;/ `% F' Z3 R9 v
}1 H9 v" M, x0 u2 m
, a5 n, h2 T& p: B1 v# ]! u /* 找出极值 */ D' B2 I$ R2 ?2 Q$ y2 Q' H6 B
for (ixstart = 0; ixstart < 81000; ixstart++) {2 H" @0 `; C- x( F
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;0 M1 }% F* H* y; p
}
0 v( i/ L9 a0 W2 m0 ^- ?4 q9 X0 q: p6 Z
--------------帖子字数限制------------------
% z) M% H; m- f, J" @# X+ ^; o. i}: }2 n6 n. \, D9 Z( ^3 `% c3 M7 z
! n% _& Q# a1 I, B7 d3 s; Q8 N: b, y. J, Y* t4 @3 | w D# o
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|