|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 7 Q2 v$ e$ t E7 k% t* q
( b" [4 l3 l! H0 m
各位大神:% a( c7 L9 Z+ b) G' i6 u
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
* j4 b/ Q$ B7 L 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:$ q) Y& ]8 H5 i; u. u: B' R
0 j8 `2 [, t8 r9 e$ n7 c, M
( o* {: T8 u; s; g/ H9 R9 ^3 f6 C7 B这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
- j" T+ [! H4 _/ ~( A
& d4 u9 `. c* y0 P k并没有其他线程' \$ Q2 C% \5 g) k
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
/ h* C/ s# L% ]; H6 U也说不定是和堆栈有关系。。。。。。; }) N% V1 X1 l- c
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
. z* I: V% D& }) @
, A% x9 p5 y6 K: M
2 B& z: J! |0 p2 T' V' I0 e# W9 w% G0 d- e" ^: y( W& j
我也很绝望啊,希望大神能帮帮忙,感激不尽,!* }" T' F7 N1 q, Z, Q2 V8 u* }; h
9 \$ f: v$ f0 l8 y5 A/ A7 Z6 U2 [" `+ }0 L, J7 d
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; l! [* K& Y1 c
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。( p. Z" A, i7 }: l3 h; x' |7 K
8 [9 Q. h" U, a1 H; g
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(( D' P+ H* L7 r/ P
const double data1000[1000]) {
! \9 s+ p* e# I/ p: D$ b" Z% x
; j/ ^# b" T: F( J- a+ h int myfuck;
6 p9 A1 K/ n; q. \+ u* z& H* J double yiDuanShuJu_mean;
0 ]5 K. I% p% ?7 T$ J. F double yiDuanShuJu_LowMean[1000];; ]+ q' N% x9 D- {
int ixstart;
4 ~0 D3 n y* z double dv0[1000];
7 k" L! N4 Y( }5 O- j3 N comm_AGC pAGC;" X9 z+ a; X x/ a) G5 O& l, F
comm_CarrierSynchronizer pFineFreqCompensator;+ h* C7 W8 G1 z7 L" O3 s
dspcodegen_FIRDecimator pRxFilter; Y/ {& Q. V/ Y) H2 y
comm_SymbolSynchronizer pTimingRec;
2 f* S4 {9 D% _ comm_PreambleDetector pPrbDet;
+ L* o9 d, J" D" ~. @' y# s4 n FrameSynchronizer pFrameSync;; ^ U6 v3 y+ s0 O S+ I" ?
QPSKDataDecoder pDataDecod;3 N& `6 A$ [4 s, o
static double usable_left_filtfilt[81000];
4 W, p% V2 n! C static double youXiaoShuJu_QuZhiLiu[81000];2 ^( s! O( J6 F. v2 [, [
double mtmp;
% u) Z7 S$ `. n, p int ix;
/ j8 X/ b: S' |! g boolean_T exitg2;
2 f" q0 D$ p5 F3 ? boolean_T exitg1;. L( T" h, Z8 E9 k) K
double YiZhenShuJu[800];
, l+ {0 Q! r# T1 U- w double dv1[800];
# r3 c6 E, W& F; ^) _' \8 x! A6 `9 v2 i, v# t# o) N+ B8 I6 V
9 S5 x( M k. m double b_YiZhenShuJu[800];
. d" V9 V9 E- w double I_filtfilt[800];+ J* R. `) ^& P& [4 z7 M. c
double Q_filtfilt[800];
4 {* b) Z1 U1 o2 b# |; x creal_T b_I_filtfilt[800];0 f5 w! N8 E C9 p R& y
creal_T b[800];+ a: U' ^ A$ ^9 c: o5 D
creal_T RCRxSignal[50];/ [+ H4 g6 m' l7 o; ^2 N
creal_T fineCompSignal[50];" E% t8 G2 G6 L( \: v: B; ~
double phError[50];) F9 C, D2 F* g1 P! V' `/ q
creal_T timingRecSignal_data[28];5 [* j9 u' i T
int timingRecSignal_size[1];% l) O+ v' {/ @" K3 F+ I
double prbIdx_data[28];% |: m3 g0 N( Y4 S# U' \9 P' @2 v
int prbIdx_size[1];
8 c y% d& u4 x" t; p double dtMt_data[28];
' t9 i3 N* D1 M7 m) [, _3 f# _ int dtMt_size[1];
, Y+ P; c' p* a3 M# y creal_T symFrame[25];
8 ^9 p* o ]& T boolean_T isFrameValid;$ o# i* A* s& p2 U; }8 Y
double unusedU0[3];
$ |( e2 w# s* X# r# H6 k: `$ C$ t0 Z* G; o$ N( f7 E
//调试过程中的变量! \' x* q( W, T: q
int enough_data;
" K1 U1 z* b. d8 h' \
' S6 I3 Q% j @7 J int enoughDataFlag;0 o3 U) l2 o r3 J! [ n" P0 I
int yiDuanShuJu_mean_int;
9 T) f' l: E5 w Z) o int int_sum_dv0;: o* u8 t# U5 `+ i+ \ ]% g7 B
int oo;
7 p0 e( L* N3 ^6 R5 Y2 s6 ~: M int ii;
. N9 H7 o+ b% I$ `+ S myfuck=10;( D7 E3 n( N) W9 B
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
9 r+ l7 G; [9 u2 r8 V /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
; [1 W- ?6 n Z1 p0 s- k6 g, W
5 g- }1 O, N& t( M* Q+ U yiDuanShuJu_mean = mean(data1000);) y# a( H. P9 @8 S/ h% k
9 ~- n. h& _& h5 o( U; s yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;9 ~+ L( U: o- J8 F* X9 T
UARTPutc('A');
" e$ r+ @9 q* G+ m, h UARTPutNum(yiDuanShuJu_mean_int);
) Q1 J3 o2 t$ d# p UARTPutc('\r');
. [. {+ J- i F UARTPutc('\n');
% A% B9 p% F+ t1 _3 U$ M4 u
! b6 g/ `* P4 t) v( p' a for (ixstart = 0; ixstart < 1000; ixstart++) {9 g& u6 s' A7 q/ x3 l7 }
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
& ?) U+ H$ j ~# v u3 Y3 E }+ Y t- l% u, w
3 {- P- I6 O: U5 { i& |
power(yiDuanShuJu_LowMean, dv0);
4 _, X$ g# {( _/ C
( U8 n F9 \% j3 W1 P int_sum_dv0 = (int) sum(dv0);
/ C1 f) r/ V3 e: H8 p( g) H B
L% F1 o1 c7 _. n UARTPutc('B');7 w d9 v# |: [8 e/ M" _* V6 D9 ]
UARTPutNum(int_sum_dv0);+ `4 ?8 r0 Y4 N
UARTPutc('\r');
- \- V1 R6 g) v) H% N r6 s UARTPutc('\n');
L: R* E n) [3 U8 Q6 j/ c3 h0 u9 y Q& ]* C
// int compareFlag = int_sum_dv0 > 1.0E+8;) ^* t$ [0 s' I9 p
* o" a- y* J! x. y if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
3 Q$ @6 {. J! j7 k1 { UARTPutc('C');
$ B' y( E% E3 t* x; K4 P5 F* t /* 比较信号能量 */) s" Z |1 J5 X4 _
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
& F* i5 W# ~0 m1 D' h# t// yiDuanShuJu_mean = 1000.0 * youxiao_k;3 O. j; v' v9 x5 P" ?
// for (ixstart = 0; ixstart < 1000; ixstart++) {
) g3 S' `0 \# K9 u+ s, {0 e5 ]// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
8 L/ Z: h; N4 d0 l; d// yiDuanShuJu_LowMean[ixstart];
2 y; m* a3 Z" f// }
5 S$ c" e+ W3 e* |! P2 n, t# B//# \/ i: f( ~, E7 {+ \
// youxiao_k++;) ]" \: o3 c) O1 ]9 `, m
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
. E2 p9 s) r$ d; n// /* 感觉要取21个数,即0-20, */
4 _: h4 _6 ]! K) Y8 o// enough_data = 10;//有效是10,无效是0
% _( M/ H5 B7 G6 g% N: f// }
. K0 F% l: S6 C" F- w/ g }3 o4 }% B( ?2 U/ p7 T0 G
- U9 l0 ]' ? ]) ~% ]4 Z l' C2 s2 J) r: v& H! `9 E
enoughDataFlag = 100;- ^+ H6 h$ \% \! W% W
enoughDataFlag = 1000;% A6 c0 `0 ~6 P& G
enoughDataFlag = 0x02;
" o4 }! S9 ?" \9 ]7 I' |: K) [ enoughDataFlag = 200;: S' i( G& L; k+ a, w
$ A* F3 a& m* J4 N8 s" \' C int myfuvk1;/ ~% ^6 ?2 {3 \) m
myfuvk1 =11;( }9 x: |( L" N) J6 R
% ~4 E! p+ k5 b; s
$ ]& O. n7 R E6 G- [+ n' K enough_data = 0;! q* X' H- ^0 n, L) Q
+ O- I: d$ i" L* b8 V// if(enough_data>50){4 w/ h8 p1 i: r+ V
// enoughDataFlag=0x01;
+ L$ q( s) ^: L# d8 N; _// }else if(enough_data<50){
7 S' s. B* t8 }# C9 s7 l// enoughDataFlag=0x00;//0x00还是不行0 W. t3 u$ o4 s
// }) |, _+ |+ v! M6 s
: R$ G$ t, p9 e, V3 I- H" W, _$ S! s
oo=10;
6 }3 K8 ?- F( M. C, {" c5 B oo = oo < 5;
# c3 s/ Z0 U# i- Y& ` if(oo){$ z% P# G9 m2 u1 b# J3 u: m
ii=0;
1 v! {0 }& P6 f$ d a }
3 Z7 G! M; n; C' B3 \( g if(oo < 5){6 A# B# w, R& ~ ?2 f. _1 [( {
ii=0;3 p5 a; x W! u. w
}
& J$ i+ K% q6 }* u8 `/ _; r; ] if(oo > 5){
/ C7 E/ q% u% u: X+ ^8 k- t2 \/ O ii=0;
: X2 `$ g7 A% Q& r5 |$ O }
. o* t1 q# {6 e' R0 ~3 {$ C- } x! o( }- m( x- `. R- }
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */5 f( o1 V' R/ e" o
/* 如果数据足够才执行主程序 */
, ^+ H: I( m" ]8 s+ K; t' v oo = oo < 5;! P) P2 j4 M2 a( E8 h
enoughDataFlag = enoughDataFlag < 5;
2 q, F: w/ l6 H5 B' `$ t* w if (enoughDataFlag < 5) {1 y* q% \# r- a4 y; O' a9 m2 t
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
4 c, y; R: A! H# |' x" N! P( t0 E AGC_AGC(&pAGC);, e) z; _% s+ x5 W
6 ` w: p: y7 P8 Y! z/ d c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);9 ]5 i1 U1 G# R) K
FIRDecimator_FIRDecimator(&pRxFilter);$ i5 U( l8 n% n% p" k
2 |7 H! {, h9 {0 `, C/ `
/* Downsampling */
6 x0 R$ j; y+ t c_SymbolSynchronizer_SymbolSync(&pTimingRec);) @2 D" }6 d, k2 k
& ]: _; z* ~9 ]3 }2 F. C
c_PreambleDetector_PreambleDete(&pPrbDet);) c& W$ R" @. U: | Z7 R
; G/ R8 u G( p6 A* x
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */1 y- p+ E) f* I8 k
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */! n) v- @! C- }) @+ O M' P0 `
/* %帧数量=100 */
7 d! @8 r- ~$ Y' j* Z4 ]. m5 N, t+ i pFrameSync.isInitialized = 0;9 H+ L" I! l0 X1 x/ s
1 q) D( ]6 V9 s( D( ?# f
/* [EOF] */- p N0 x3 @% }2 L/ z% ]& W3 @
/* 前导码长度是13 */
0 y9 \7 l$ N# {0 z; }. S /* %qpsk */( l' H$ Q/ K# B5 _# l: _, u1 Y& c
pDataDecod.isInitialized = 0;
8 x6 w# t4 l, J$ E# O1 R0 x% y8 |# P5 Y* |. J, C* o
/* end */
, L! |3 @: ^* g4 {; V) f6 Q7 J /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */* E, D8 E. o) V Q
/* Convert 3-dB frequency */
, C2 @0 ]9 R6 R5 r- O6 T /* Convert 3-dB frequency */3 Y1 J7 j% `4 R4 i& B( t
filtfilt(save_buffer, usable_left_filtfilt);
- V/ y5 q3 \% o( f+ F5 E& r @" N for (ixstart = 0; ixstart < 81000; ixstart++) {
& P' H# }& w5 V# | usable_left_filtfilt[ixstart] *= 2.0;, m& ~- e1 h, t& \$ s2 O
}
, l' h5 {1 {7 q& j u
( Y& @- b8 j8 ^7 F /* 注意乘2,处理幅度 */
* f3 Z3 R2 |, U/ i4 Z /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
) J" E) F% Z% K. Y /* %% 行列转换 */
8 H' Y3 ^" B, P# o yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
0 Z( F. W; d a, m/ s# d9 y for (ixstart = 0; ixstart < 81000; ixstart++) {
: G# u) Q* g! l0 G" e9 E4 ` youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]4 z3 Q3 d+ v+ V
- yiDuanShuJu_mean;
3 c7 |% J3 K3 g! H }
8 Y0 Y; r7 e4 r
6 _: L. F& c6 |; j /* %% 应该对数据归一化,但是这一步放在哪比较好 */1 |+ @2 l. B3 F9 o5 ^$ s
ixstart = 1;
) T% `7 J) ~/ J: n$ @2 s! K4 M mtmp = youXiaoShuJu_QuZhiLiu[0];6 D; X! C- d0 K( f0 E
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
; S3 d; o: _9 d+ n( b& ^ ix = 2;
1 {' ]% w V& a3 _' L5 } exitg2 = false;' y& K) ]: }5 }# B: q+ D3 l& }
while ((!exitg2) && (ix < 81001)) {
( X3 u B5 [" V. U ixstart = ix;
& {) L* P/ o/ O$ k4 D if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ Q6 n3 @* q& `; T
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];; L9 E0 A. Z; v+ c
exitg2 = true;
9 Z* ^; {; ^5 p, w* P. f } else {# u2 h X8 w( F" D# f
ix++;
7 ]/ K8 g; S% Y- a- u, I }8 Y: U) v- F" t: x0 |6 D, ^
}
: h# q8 \6 W$ J0 v }4 J% @# Z$ n: I8 s _
: g% G6 m6 _) [' f A9 r- o0 h& |2 l
if (ixstart < 81000) {
) p2 e; z/ Z, l: J" R: P/ h while (ixstart + 1 < 81001) {
3 A% D8 F) X/ M7 N0 i if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {0 x: F; U+ b- @" x
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ }8 x8 b1 c0 y6 a+ S }
, A' _( W' U z( }& u# f
5 s. [$ l$ }, { ixstart++;* A5 K. X! g: d) x
}
. u! B0 `: I3 ]% c/ I% [ } v6 U$ l; L: U/ k% ?9 S
1 d3 @* q4 I- O" l
ixstart = 1;* Z$ b$ S; i% A6 n9 U6 O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];0 j2 H2 ~. @9 n8 D! N: K+ @
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 J9 M5 z! s+ U+ ^8 r% t; m8 J
ix = 2;5 N, V2 v N( j) o4 o7 }8 `
exitg1 = false;
3 u8 s8 o; h( @' c2 p; ^1 T# {& k while ((!exitg1) && (ix < 81001)) {* W* m. A1 x* a) Z$ y$ m! [6 F
ixstart = ix;
' w( b0 q# D4 ], Z3 f! j) }4 B if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
- B: g6 \# y! q& C5 ] yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];- j, `( _* }# ?3 i) }
exitg1 = true;
8 q2 Q. ^6 e* F- k$ j/ G( M c } else {
+ U& j" |6 B7 ^- |( d3 p ix++;
3 b, V! V' Z: |, }5 y }
$ y' }! n+ \8 w9 Y" i: W8 z }
! o$ j! S) C0 K; N7 Z }
/ \9 w. V* t7 L+ B U9 d% F1 f5 q/ x6 T
if (ixstart < 81000) {6 X) T8 h/ N) m7 I# q# [
while (ixstart + 1 < 81001) {
' u0 C$ C8 }( [: V- h if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
O' T) {; _) i6 e- ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];4 ~! N- M# u) a" i
}1 _' B5 n# ]& |+ `9 |! ^% I8 O: \: x
8 ]$ z I6 g6 K1 v3 I ixstart++;
: _0 s9 K" R- `( ^ }7 n1 b/ O2 |, L o8 A
}
! }9 @4 @' \( g' t' K1 Z- h2 ]4 h
6 A8 o' Q* |4 P+ G% ~$ j yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);- G4 Y7 p/ p7 d; y( g, S
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
. y* q4 Y; i8 X0 Q yiDuanShuJu_mean = mtmp;- E: q0 G) Y |6 R$ }6 r
}$ {+ C8 M0 p5 {( Q% X' n
$ j C5 U0 I+ U# F( a /* 找出极值 */
% v, `, w2 Q) \) K" j4 } for (ixstart = 0; ixstart < 81000; ixstart++) {+ F% Z: l- m T+ a: i4 h
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
; O2 k2 A1 G' Y1 ]1 q5 k2 L, b }, B! _% [5 G1 t. V8 g8 W" }( _. i
6 |2 e2 N+ j% S! k: k# y# x --------------帖子字数限制------------------
& X* t# O' z4 P f( g9 f5 r}: i; X$ R# O; K3 X! o6 s8 b$ G* I4 ]
- q) h2 s4 c( Z* a0 |( e
. N( N- c" M, ^$ w; p) B% \/ _, b
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|