|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
# Y6 x" W Z. P) _4 F, E+ O* x% K0 S1 K9 r, U/ i" L9 S4 T" I
各位大神:. g5 O8 I& U% t6 A$ C
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)6 N S6 k; _0 X
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:9 w, z" q k$ ~. D
/ w" e- w" e# j# H" b- m, `7 _
1 d+ `' ?+ v9 o/ W这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
/ H6 y3 d4 r4 f8 E9 {$ m1 u! U' Q7 @7 R/ P; }" e9 q: `
并没有其他线程' _& M' Z2 ^9 |4 j: {9 b
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% |, u2 `6 B h2 `, O2 b
也说不定是和堆栈有关系。。。。。。
3 h) S: _1 R* s0 v ]1 z请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....7 t. g; Y( Z5 I* r3 H4 H
% |" ~! y- r( a: C) P. a* \4 [, [* K
|/ W4 \/ i' H/ i; Q/ h' j0 J我也很绝望啊,希望大神能帮帮忙,感激不尽,!
' \4 V5 K) U; j o# g4 ?3 S* P9 `) @% x# P. p9 v
4 K' v9 O& V- ?& q$ I) a5 v; K
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
* b+ a& Z% A0 t static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) Y- N9 A3 e2 M K
) `/ {" m. z6 b; i9 \, Y' S) Y
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
* W$ a" ~, ?4 E- B const double data1000[1000]) {
" w7 R3 B1 u m3 v1 i! R9 {' N9 r+ u
int myfuck; v* A' H, G5 @* O2 U
double yiDuanShuJu_mean;* P4 h1 |) H! V/ A% V! a
double yiDuanShuJu_LowMean[1000];1 J8 a7 A0 l( X
int ixstart;; v4 b) l4 r. F$ a, n9 Z
double dv0[1000];+ Q) |. e0 u* r3 r9 `7 w# x7 E
comm_AGC pAGC;
' V4 ^5 t! f" @0 w comm_CarrierSynchronizer pFineFreqCompensator;
1 W ?7 u) G8 Y( h- N3 z3 x, Q dspcodegen_FIRDecimator pRxFilter;
' N" r* u4 d0 }$ V& b comm_SymbolSynchronizer pTimingRec;
( K" p2 S0 u8 v comm_PreambleDetector pPrbDet;; e: O1 Z: B3 A b. z9 H
FrameSynchronizer pFrameSync;
, f; S% o* H% W! d# N' Z QPSKDataDecoder pDataDecod;
- @/ B1 ?. |" Y! j static double usable_left_filtfilt[81000];: W8 \+ c+ f+ r& D. `5 T1 K7 ?
static double youXiaoShuJu_QuZhiLiu[81000];( G9 p |: V& Q, q6 a2 o) z6 M
double mtmp;
+ K, H$ ]" q4 F: a$ s$ k int ix;
. E1 q! h- m. P& w! M V# Y- f boolean_T exitg2;
" x: J4 `% f1 @4 u% e6 w( m boolean_T exitg1;) e9 Y; c( h" F& V# [% r4 o/ E
double YiZhenShuJu[800];: K9 i0 g( D i* x3 F- z
double dv1[800];& X6 Y" [, q8 ^
+ J: F& @, I& f; }, u5 w
! M" w2 `2 f7 z4 {% q1 a! w double b_YiZhenShuJu[800];! b. y! h6 d, ~1 M9 B
double I_filtfilt[800];
' U% K5 A4 P" t9 D double Q_filtfilt[800];
& b' d2 g5 A! o' [ creal_T b_I_filtfilt[800];" W1 N# u( @9 M* {1 p5 C3 r, s
creal_T b[800];
# `) {( |8 A1 A9 I. E* m( o creal_T RCRxSignal[50];
- @( M/ }1 {3 h) Y' y creal_T fineCompSignal[50];
& m$ Q! p; J q2 O% B& q. f double phError[50];* n& O) Z0 J0 [; ~7 H3 w
creal_T timingRecSignal_data[28];( o. o) B8 H8 a3 q1 n8 m
int timingRecSignal_size[1];( u. e$ J" Y. I
double prbIdx_data[28];6 T+ w9 {7 v6 b4 J
int prbIdx_size[1];
+ F9 Q! m8 Q% ^/ U2 V" I double dtMt_data[28];' }! t1 k9 O: a- l7 V: ]5 s
int dtMt_size[1];
+ F4 D0 T5 ]( Y L creal_T symFrame[25];" B0 C, F- a3 K/ v1 O0 `9 O2 [
boolean_T isFrameValid;
) u; Z9 t9 m; Y- U# g double unusedU0[3];
7 Z1 B! G0 R! a" @1 B' ]1 a
$ q- Z% z! e9 c$ M- R# i% H //调试过程中的变量9 ?, V' k( P+ ]1 S. K' p2 P8 u
int enough_data;
! a" \1 e) _2 }; c! ^+ m
, R4 Q$ f% C6 x$ o int enoughDataFlag;
8 N" e/ \4 ?6 e9 i% l0 U5 {7 ?$ m int yiDuanShuJu_mean_int;
6 C( q/ T9 |1 W' H. E0 k/ U' O3 o int int_sum_dv0;/ g: e4 P/ |' ]* d" h+ V7 l9 U
int oo;
4 j( h; a5 r& Y( P% r int ii;
) ?9 w0 {5 |9 L; h) { R5 v myfuck=10;
% `7 \3 k: @+ r /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */; a3 \) u+ P7 @
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */' {& M1 w( H; V# j
- u6 R0 a) B7 m" M+ E% O% O yiDuanShuJu_mean = mean(data1000);
6 u' C- u `' ^3 r6 C/ {' X3 F6 L0 x3 _' {, I
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
4 x1 z% H3 J" n" X+ H UARTPutc('A');
! E1 ?3 q- b2 U6 o5 ^% K# O' D i, F3 F. Z UARTPutNum(yiDuanShuJu_mean_int);. ?: r! v* _) ]. s8 n6 d$ m6 D2 |
UARTPutc('\r');
- u, \: I5 Y$ ]% g, u UARTPutc('\n');
& z x7 ~$ W$ C4 e* B5 h+ ^
# Y, d* k( w& C8 ?- C; m for (ixstart = 0; ixstart < 1000; ixstart++) {
5 e( b4 y4 s* p p& \ yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
( o4 c% {3 ^9 U3 e; r9 z }
" o2 `0 C# W, z+ Q* h1 q6 C3 C: }* x/ Z% j @
power(yiDuanShuJu_LowMean, dv0);
. C A' o) ]" Z) z5 r
/ x6 |3 G) l4 y/ N1 K! W: J- X i( K int_sum_dv0 = (int) sum(dv0);6 X5 x" `* P" @5 {
/ B w& ~% p2 M! p: b* d UARTPutc('B');
8 E5 U `0 I4 O& f1 ~ UARTPutNum(int_sum_dv0);. D1 y2 j' P% S7 w! D' J
UARTPutc('\r');. J- n2 r6 b, f) P! h: V% @
UARTPutc('\n');
7 j+ @( |! _9 B, M# K4 O4 }1 e
( j; S1 O: C' A6 p1 x: w// int compareFlag = int_sum_dv0 > 1.0E+8;3 Z( i) |2 f5 M8 S2 n' ]
5 [& Y1 g2 b# c- W7 Q7 i+ p+ K if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
- m! j/ ^( l$ d+ d; V' e UARTPutc('C');
, A% b# @- [( j9 T+ R* h a /* 比较信号能量 */
1 Y' b- z; V8 i. J% v /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
) v5 K; j, G X& ]* H// yiDuanShuJu_mean = 1000.0 * youxiao_k;, x4 a5 n* z6 |1 G
// for (ixstart = 0; ixstart < 1000; ixstart++) {
* H, v0 x3 Z$ J3 d5 c// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 z, K% O [ E" Z& {1 Q; a
// yiDuanShuJu_LowMean[ixstart];
/ ~+ k/ f1 |7 s6 J// }0 W% j8 `* C8 U* n6 R
//
4 F" @9 J- k5 a// youxiao_k++;
- S7 J, @* ?+ O! p// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
( [1 J- Q% M- U% h$ c1 N// /* 感觉要取21个数,即0-20, */
% k8 e: x* ]7 x( P0 g// enough_data = 10;//有效是10,无效是0" G `2 s) W& J/ h) M8 R; X! c
// }' }# k( P8 Y) c' b7 ~, T
}
& C: T4 o) d4 a, k: }8 N+ f8 x7 @6 r4 c& N5 h$ d. R7 ~
1 ~5 g* }! H1 j8 n9 s
enoughDataFlag = 100;, Q% |% |0 d: V9 B. g, g
enoughDataFlag = 1000;
, {" E3 v/ X. K3 B enoughDataFlag = 0x02;
: d: e* S. S0 b P0 F2 m enoughDataFlag = 200;2 u; r# ]* P* }7 l) Z
6 x; [* }! f/ u
int myfuvk1;+ Y' M- H" K1 q& d/ C" y- U7 W
myfuvk1 =11;0 r8 s6 U& D1 _# V+ c- M
3 y( B& J* Q( s/ I; z2 O
6 }( l: a7 f }) z7 {4 X enough_data = 0;3 R; k6 @ F5 S( K* B- A
$ y' ^5 \+ Q5 S1 ^& j5 O* U$ m2 A9 b
// if(enough_data>50){
% [ t/ o# d: a, D( w9 G8 Z// enoughDataFlag=0x01;
1 ]4 v9 u1 W8 H) L/ [// }else if(enough_data<50){. }& l! d: n& y. D! n& J
// enoughDataFlag=0x00;//0x00还是不行
: f2 q5 E8 O" K' P, m, c8 S1 }2 q// }
5 C7 X0 o) W' _- I) ]( F2 O5 e
4 [: m" h& v$ t8 F) d5 t6 x8 Z8 q, K0 J1 ]9 [
oo=10;1 B4 D- x0 I% v+ I" X+ m# H
oo = oo < 5;7 ^/ x0 {: ^' j8 x5 m: i# h& h
if(oo){
; A, k0 {* E% D- H. ] ii=0;4 C% ^; ^! z$ x: K, p" m
}, Z' _+ p9 P, J2 k3 X0 @4 ?
if(oo < 5){
# J1 W: R5 s5 Q ii=0;
; x/ m7 a& E5 o1 l }6 D/ S* K( w- ?( ~
if(oo > 5){$ ~9 T6 ]- H8 J; J6 p" v A3 o
ii=0;
7 X! P9 x7 p- I: t2 g) O/ Y% _ }
. {) }% g9 f. x- Q l. ^7 j: x+ ]7 {$ }
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
8 P. h4 [+ f; ? \- p2 R7 |) A /* 如果数据足够才执行主程序 */1 l9 ?, X/ v4 I. `7 W
oo = oo < 5;
1 ^! R( W6 F2 u L4 L) h8 h1 r+ } enoughDataFlag = enoughDataFlag < 5;
' t j8 h3 Z8 R/ S' B5 I4 F5 i if (enoughDataFlag < 5) {
, |1 Z5 T F2 T o6 \// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
7 w! P9 Z% r% ?3 U7 P7 p" Y5 Q AGC_AGC(&pAGC);9 H3 d! {* N" v+ B N8 Z- e/ ?, m3 C( |
$ U0 c5 |9 r) K0 ?* | x+ v
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
" G' v" L4 n3 h. \ FIRDecimator_FIRDecimator(&pRxFilter);
9 B9 K! E3 {; M6 j- B
6 j4 D6 w" I( U' R3 M' ?/ d /* Downsampling */2 B9 n2 Z2 f! j( g9 _ w& l3 o$ S, R* H
c_SymbolSynchronizer_SymbolSync(&pTimingRec);+ D {/ ^% G2 T. e5 A8 s
4 Z5 e8 B) p- w) S8 y, K' R. P c_PreambleDetector_PreambleDete(&pPrbDet);
1 E% _) G/ ~5 K
, z; X1 h4 C. _$ y7 J /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */* e) @( P w$ Y! u
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */; \; p$ \7 b; j4 r) Y, d& g
/* %帧数量=100 */
9 s$ k7 ~4 w l6 d) s7 ?7 W# P6 L pFrameSync.isInitialized = 0;1 h& v; E& |. C4 V+ h$ J
7 Q: ~4 D. z9 C1 K$ R* w
/* [EOF] */- N& w: g4 f, ], |
/* 前导码长度是13 */0 X3 K1 y# l" D% f* y
/* %qpsk */
' l$ N) G$ y' P: ^ pDataDecod.isInitialized = 0;* c7 D* E' a3 c/ O& s i" w
' [* t4 y. F: v1 W, o /* end */
2 K# r8 D# g, O0 [8 l" @; U3 t /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
# k, C# ? \5 [9 D5 ~: Z1 y /* Convert 3-dB frequency */8 Y [2 }! j. K, W `) A# c
/* Convert 3-dB frequency */
' c! n C* M( e filtfilt(save_buffer, usable_left_filtfilt);
3 @& X: F& r( ^; J: K9 I& T/ { for (ixstart = 0; ixstart < 81000; ixstart++) {
2 l+ }2 s( d2 b: o. h% [ usable_left_filtfilt[ixstart] *= 2.0;+ s$ U8 a* f9 |$ h$ K
}
2 A+ j* d3 E2 W( B1 R2 p( P" A% z% ]4 z( ^
/* 注意乘2,处理幅度 */& Z4 z8 f; ]6 @& u2 o6 I
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
7 H" u0 ~ D& \* l9 S7 Q /* %% 行列转换 */
8 w9 @4 y n) v* F3 e1 } yiDuanShuJu_mean = b_mean(usable_left_filtfilt);. H4 K2 e+ O; Q
for (ixstart = 0; ixstart < 81000; ixstart++) {& M# o6 ^6 q/ W0 ~( Z0 q
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]# n+ ]; B1 p9 f) H
- yiDuanShuJu_mean;, ?! Z* O/ C4 P2 S3 T g$ Q, S% W% O' Q
}
( M% D k) r$ m
( g8 q8 E4 J! k /* %% 应该对数据归一化,但是这一步放在哪比较好 */; \+ M, S% k5 k# J; e* Y$ A
ixstart = 1;
. {: B9 O4 F9 O5 h5 x9 ^ mtmp = youXiaoShuJu_QuZhiLiu[0];$ `% G' }* N. }/ @! s7 S5 M2 x
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 N5 C3 W* K5 I. X, ^& k5 e/ x ix = 2;
2 U8 k! f" i" p7 M# U6 p exitg2 = false;
* V- ?! v# L+ o# P while ((!exitg2) && (ix < 81001)) {
M3 t/ E. u$ k/ P5 r ixstart = ix;
& h: ]* V- g& t; O if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 D$ D- G& K5 @6 Z
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];, u/ V& v1 t, F' n [( ?8 _/ I: Y
exitg2 = true;
$ r5 ^% g4 N& _% B0 Y$ o } else {
2 Z, J& ?* G3 j7 B) o5 ^- p6 w# W ix++;
. u3 `7 @* }) N/ g }4 t( e r1 s6 D- e% R
}' @1 ]# d; W+ {+ c# I; f6 t3 M
}
, _ H- F1 S# i/ }
! n9 } ]; @+ @; t: j; I4 m# v if (ixstart < 81000) {
4 U' u, o: h9 F' Z g* w while (ixstart + 1 < 81001) {5 [5 a5 W t y' b# @4 V# F+ t
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {/ ^$ P( H# F: t$ M1 ]) T) t1 R/ I
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
- E* Y9 C0 M. } @' H }
; c4 C/ |3 E3 j3 ]/ T2 s9 K! i/ [# g, ^+ b# S" J, B
ixstart++;
( t$ N( a& g/ Z }7 @6 S! V* ?9 R" G
}1 J: d6 X/ d* w' w/ v& z( H
- y) _1 } W' v$ a2 g4 }$ j+ Z
ixstart = 1;. J6 p& {* l& Q* J; Y
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];7 a: Q: z- _3 O
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 [; M7 w" A. z: u ix = 2;/ u O4 X0 c5 {, r$ o
exitg1 = false;
' q) l/ s/ i) k- o$ J5 m) H) z while ((!exitg1) && (ix < 81001)) {
' \) N0 d. H u% |) V ixstart = ix;
) I5 y0 v' `% d$ s" z+ H' T! r if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* @, O, \$ w' N" q/ {! o6 @+ k yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];$ D1 p. ^. w9 X# i' _
exitg1 = true;; z& x* g T5 P+ M2 {8 a+ `8 c! Q
} else {9 y# t" [9 Q+ v5 _$ _; ^0 A
ix++;
# b w, a6 ?$ n+ f2 T }9 j* Y$ J O7 `0 E- B
}
0 [$ X) S3 N( d- A }
6 S0 n0 G4 s( E8 `/ j$ z5 C
% P$ W' X6 k* L1 G, P2 I if (ixstart < 81000) {
7 Y" r. W# @0 x/ g% I) Z/ | while (ixstart + 1 < 81001) {
/ c4 @ F- Z. h, _6 @8 x if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
1 d- t, @0 c- A yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
( \! W! j, [$ ?& w8 T) A8 D' k }" c1 t' Y- G( l
) T! `$ N" S0 Y4 ~; N ixstart++;8 Q% ~( r% E( k" w
}% @) l" J4 h* m1 _
}
/ y+ `; y4 a* y
. c+ v( }, d' U- L" \' ~0 G+ s \ yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);0 u+ B. m$ |7 M y* o& ~6 _; l
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {5 a3 q+ {5 r t/ M
yiDuanShuJu_mean = mtmp;$ P1 b4 @9 g; M8 P' M( G
}
) I/ d$ z1 w D# {# C, W: H0 V- X7 [/ x4 L" u& H, `; v+ u
/* 找出极值 */
3 ?& u) l/ ]1 T* u, O. f2 }/ ~ for (ixstart = 0; ixstart < 81000; ixstart++) {! V8 Q# X' X2 M# q6 V$ c3 ^
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
: k) x, I4 a0 j$ M! g2 Y9 J }' u3 Z$ V6 H7 \- y( o) ^* s8 o
' x2 S: N8 |! L9 x. z --------------帖子字数限制------------------
* y3 N* C4 \/ {}
& x: y7 V" f( j# O v; d! {" ~8 ^' f1 n+ [: P+ E& s; N
. a2 G! f. P, V1 W( F |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|