|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ) L2 Q: ?0 C) l5 j L
) b0 G: }5 n! y1 S% ]' U& o各位大神:) E2 `; L& T# u. l
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)* H* P2 Y+ t& i8 I0 Q, D
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
: v' C" m" e4 E8 P1 x1 h+ w: \
; x% u1 w5 T: s* b* ` , S: [& p& q0 g" c# O
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。& v9 j0 M+ \2 c: p, s8 z" N$ Z$ F( c
2 n) X* r1 p4 m, t! }
并没有其他线程
+ r) K" M! s6 \' b1 K) [' n反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
1 u! S; D1 P- p# t6 e也说不定是和堆栈有关系。。。。。。. H6 o6 `/ K: R9 O2 l9 k7 y% F1 p
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
5 }8 |; l# F% n7 n/ b6 k/ G4 f: y2 t+ a( I( z7 e
/ A' O, [' V2 A8 C
7 a* x% O& x) p) {2 x$ H我也很绝望啊,希望大神能帮帮忙,感激不尽,!# Z0 }( Y3 \# a7 ?8 ^% b/ I+ O3 m
0 W |; ]2 U7 l, Y: x
0 T( n- ]2 K+ [
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
3 t8 L# \( e- V static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
4 M7 h+ t- t J7 m8 q+ F
& U7 C; E, K2 u! rboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
5 p; c; X! t; Q8 D const double data1000[1000]) {- C' p/ ~" v+ N0 m* K) U" f
# x2 j+ J8 @ H5 C$ _9 |' ~6 ] \ int myfuck;& }1 Z' F" x. n8 _4 v5 [
double yiDuanShuJu_mean;
9 ^1 g% G9 ~4 o( d* f double yiDuanShuJu_LowMean[1000];
, v, Y, Y! J5 F$ ]/ \8 L int ixstart;* o* C: O- ^( t$ E0 g9 E7 ~
double dv0[1000];- P& K+ l3 n' A$ L
comm_AGC pAGC;
/ O. V3 S+ }, t' i1 t" M6 K comm_CarrierSynchronizer pFineFreqCompensator;
2 n7 \- P( c; F0 j; W5 k$ h6 X ? dspcodegen_FIRDecimator pRxFilter;1 l3 X6 ?' f$ k# S. e
comm_SymbolSynchronizer pTimingRec;
. i7 s2 _- D9 O3 F comm_PreambleDetector pPrbDet;
% ?0 g8 J8 k4 }6 N& @: \: l, J FrameSynchronizer pFrameSync;( N& p; O' Z7 x2 d3 Q# I9 T
QPSKDataDecoder pDataDecod;. ^) Z; m% V' a& j9 i4 N/ e
static double usable_left_filtfilt[81000];
- ~6 m# C. d. A! o/ ]1 y/ ] static double youXiaoShuJu_QuZhiLiu[81000];3 Q4 w1 H& n0 \/ K
double mtmp;
! b9 x4 X( n& B% d: ^6 H int ix;
4 ^# F: Z5 G [4 q0 ] boolean_T exitg2;+ G# \3 Q8 e* D# r1 B0 ]
boolean_T exitg1;& R. c" D+ ?" D) A; x2 K" T4 G
double YiZhenShuJu[800];& D Y5 g* i1 Z5 [+ C" {
double dv1[800];; X! v5 ^3 K0 T/ H( k) c
7 X" {6 E+ j8 ~7 \$ M
1 P; k% P' e0 h) | double b_YiZhenShuJu[800];
# T+ x% g7 ?. e1 H# r$ ^ double I_filtfilt[800];- K9 r, k" A! }- V N0 {/ W# z
double Q_filtfilt[800];
" ]8 K# Q( Q# m" [ creal_T b_I_filtfilt[800];
3 C) F/ l0 X2 S) [0 ~ creal_T b[800];
) R, W& f9 H3 l! @% e3 {# i creal_T RCRxSignal[50];8 T: F, A% w( n5 B( Q6 @# ^4 a2 B% W
creal_T fineCompSignal[50];) w7 P2 C1 o% A7 v. i
double phError[50];
' }9 m& R8 j0 S3 G" i creal_T timingRecSignal_data[28];
: @$ C. l# |, l$ g) o9 M int timingRecSignal_size[1];
7 m; U. _8 |! C2 L2 D8 `! P! N double prbIdx_data[28];
2 t: P4 ~8 B* h7 a6 L2 c int prbIdx_size[1];
! A; T( V8 _: x/ |$ n3 k; x/ l double dtMt_data[28];
6 L# Q' ~ m! e, X q# G/ M int dtMt_size[1];
! e( ^! n: c- ? creal_T symFrame[25];+ \7 X* }/ @& U' A9 n7 j8 y
boolean_T isFrameValid;
+ \3 i. B+ q# {$ n double unusedU0[3];
$ {! T" e( s; u! s* X* \6 y6 m! V6 L- A2 P0 w. S; |
//调试过程中的变量
5 T. e+ p5 H3 V* x& _2 D, k int enough_data;/ \3 J1 N' p; |) L5 F0 W: `5 [. s
7 Y2 |0 `2 w; p" N
int enoughDataFlag;' c8 `4 M' ~" C( S' L! x8 ~) R
int yiDuanShuJu_mean_int;
; n9 Z5 q6 ^; F& d' @ int int_sum_dv0;
0 H% Z4 b* ~% E8 I" g5 T& M int oo;. D. D, @9 F/ y; z
int ii;" W' Y- h! l- ~, f
myfuck=10;
( R8 y2 J6 _4 ?+ G /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
4 Z6 A A! h- l0 Y0 W /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
# m( x/ y3 _: s+ E( \
5 S4 T7 A8 ]! j yiDuanShuJu_mean = mean(data1000);0 ]9 g6 G: Z2 T! F6 b) [( e4 F
b2 u8 p3 ?2 Y6 Q) I yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
6 \1 c- D$ n4 T! H, l- E UARTPutc('A');* W& K) v$ Q* O9 p
UARTPutNum(yiDuanShuJu_mean_int);( S: t; F% i$ `- ~
UARTPutc('\r');
! G7 n$ ]* f0 k" u3 { UARTPutc('\n');# G4 l& F" _7 O: |( v
3 m+ a I1 x# f7 l. g! B: G0 R for (ixstart = 0; ixstart < 1000; ixstart++) {
8 W4 V9 w$ a9 e4 J% x8 v" E) t2 ? yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;; u" h. T9 m) V- b& Z2 a8 N: |
}! q p4 d% B X. U, N, W5 q5 W5 U' p
& J9 m, c7 [1 Z' d power(yiDuanShuJu_LowMean, dv0);
$ ]9 u9 |$ D# i0 ] A' V# Q& s* I9 V4 U% x1 q
int_sum_dv0 = (int) sum(dv0);. U, E8 h" C% O7 s, J" w4 W
% A; f k- i. g6 N4 x; q UARTPutc('B');1 t3 W5 G! L3 J
UARTPutNum(int_sum_dv0);
) P8 N+ ^- T1 t; B- l UARTPutc('\r');
5 z% z: s4 P) _, l5 ` UARTPutc('\n');' G$ U) F. T" R; g1 P4 y, C
& y) V) L- O& _" Y5 i// int compareFlag = int_sum_dv0 > 1.0E+8;
/ k/ ]6 u0 S) u: n4 d0 r0 z0 |+ B7 M' S4 O% H: S, W( h. c, Z) a
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?; k% |- |5 n; ?# D5 n0 q
UARTPutc('C');
`/ {- q: u# v. X+ p /* 比较信号能量 */7 ^5 |$ G! V! f [) h. f4 s$ F
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */# H* ?& i% s5 ~2 y4 [- v
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
! k6 k. x8 S2 b5 G6 q; ?// for (ixstart = 0; ixstart < 1000; ixstart++) {
* e; S" i/ d, g0 p3 P c// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 A% P5 B2 `8 C3 [9 A+ Z0 C. c" Q
// yiDuanShuJu_LowMean[ixstart];! |# y! o8 |" C
// }
% S, G |6 ^; k1 v//
- q# R4 q3 q, l9 e& C: B/ ]// youxiao_k++;( f! D& [6 A. s$ i
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
0 }* }9 N6 n- w5 V: \// /* 感觉要取21个数,即0-20, */
- ~ ]$ G, ?' _// enough_data = 10;//有效是10,无效是0
/ b4 I- \' Q8 W) p2 K/ p// }
& k0 W5 [2 ^* f) [+ h4 Z }' \6 U1 c" m' R$ `
8 L9 z$ j- q0 b8 \/ F
& c4 S* X) D( } enoughDataFlag = 100;% T0 p4 E* w7 H0 P4 h5 O4 g
enoughDataFlag = 1000;
9 X( i2 I Y- f0 X2 `7 @ enoughDataFlag = 0x02;+ ] B# C; L0 @9 t% e
enoughDataFlag = 200;' q I5 P! b) [+ A3 t3 \9 L( r
; v% L) _1 n0 M: \5 V! _) ]
int myfuvk1;8 C4 v! }, H: w- A, I
myfuvk1 =11;
- V/ i/ e3 S8 P; O6 F+ Q- V$ u$ L8 V- d( m& j2 i. E, G
1 _1 [' U g" R+ W# B
enough_data = 0;
i0 T7 `& k/ L- M0 o
7 p9 l4 f3 |& Z9 l+ Y0 ?9 q// if(enough_data>50){
% ` p' J/ v j5 T8 O$ f// enoughDataFlag=0x01;- q7 E: M5 ]" w$ p0 R/ d
// }else if(enough_data<50){
$ ]" |( X) w, v% G) f// enoughDataFlag=0x00;//0x00还是不行
- r: j5 v; U! [) F5 L" r// }
# U9 @4 y3 o( `) R# Q; Q( x' H) Q! P) z! J: M$ R
' B+ O9 I; b! l, B oo=10;/ ?3 T, f: @; z8 `0 K, Q
oo = oo < 5;9 E3 a4 q. v& j t! U0 `
if(oo){; L* E/ \+ ^6 C: B4 X$ I. A4 l$ @- w
ii=0;
7 J% o0 Z8 Z% d# c }9 n$ L- \6 w; n
if(oo < 5){
7 S! j( D2 N1 D. Q5 i" X5 } ii=0;& M9 b/ f0 C: k
}
8 m! `+ X$ G7 q% H( E; a if(oo > 5){& l6 L+ Y% H$ i
ii=0;
. ^1 v3 t; h' y' m# t1 ~" y }% W$ A7 z7 N. C) r
9 }' \+ t7 \! E: h1 _" h) U
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
' P7 H8 `7 m: a7 W% x+ a /* 如果数据足够才执行主程序 */
+ q1 v7 N$ b9 R) H" D6 F( q oo = oo < 5;7 k2 S0 i! O* v) ]. `
enoughDataFlag = enoughDataFlag < 5;
2 Z& O8 T9 Y7 p! h) A0 S if (enoughDataFlag < 5) {5 o) g) [" D% e1 g* L- I: X8 t% e
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
: l* N1 m) S( j$ K0 A$ Y) \ AGC_AGC(&pAGC);
2 ?7 O5 M2 L' N+ P7 L
7 D$ j1 `# N7 `4 T% X c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);( z* J' D4 ~+ w8 Y/ j
FIRDecimator_FIRDecimator(&pRxFilter);
4 _; ~7 ~% O, @1 E8 x) ~) c
2 V3 ]! g8 M+ D /* Downsampling */
: F) ]; |2 B# f4 ~4 l c_SymbolSynchronizer_SymbolSync(&pTimingRec);3 x; J! b% \# U. K3 M8 k2 D
+ d- \0 Z J t: ^; l0 C% f# h* B& ~
c_PreambleDetector_PreambleDete(&pPrbDet);# r& r$ m( b2 _. U$ @9 h5 u6 G1 k; X
; {4 n& X' o8 s( D& b/ Y. h$ n S/ ?. l /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
- ~# s+ y: E! z( u /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
8 h& ~0 M5 e; M! V3 q# v /* %帧数量=100 */
4 q7 B! m) [1 C, s a pFrameSync.isInitialized = 0;$ W. i, t4 d. H$ m! \
X" ~6 C0 X9 k8 l+ H! q/ ?# B8 [
/* [EOF] */
+ L; ~4 H* W) L" K2 k /* 前导码长度是13 */
7 j; L. N, R% k8 s9 }* w8 X5 y /* %qpsk */
0 r: v& m, y6 W, R+ w3 p4 D) F- |; b4 ] pDataDecod.isInitialized = 0;
% _4 }/ X5 X% V9 s+ U- H0 T: ?
m _, R9 M0 w /* end */
. k ]7 r: x# K /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */5 c" V, I8 V+ n6 L8 e2 P; _
/* Convert 3-dB frequency */' W7 y' N4 Z) Q* c
/* Convert 3-dB frequency */
" ^2 U7 l! V I) B! h filtfilt(save_buffer, usable_left_filtfilt);
. J: g) j5 i4 N for (ixstart = 0; ixstart < 81000; ixstart++) {5 ^4 q9 h0 O+ M7 ^, B" q
usable_left_filtfilt[ixstart] *= 2.0;
& y( M3 f) \& F/ Q }
8 Z; ^2 b6 y6 b2 U# m) Z3 T7 x$ |
- `1 d# _2 I4 B' R; x3 A /* 注意乘2,处理幅度 */
' y% ?* [& s* z9 A# V, @9 N! D /* %% 我发现带通之后其实就均值为0了,不用这一步了 */, A7 I1 w+ y, t/ o. u' ?
/* %% 行列转换 */$ o. g0 Z" W' F. @0 i
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);; w3 @* C; B' ^! ` D3 H& Q
for (ixstart = 0; ixstart < 81000; ixstart++) {
5 e" r! _0 s! C$ x" h0 t" @9 y, K7 b1 \ youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' h* v, |' ?) O0 X5 ]0 j2 m* } - yiDuanShuJu_mean;3 g, ^8 E) \& r W$ |' R
}
, t9 D9 ~; @/ H6 B: ^3 _4 o2 W o
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
+ L- G, \) z/ M) X' f ixstart = 1;# u% |3 f* H# c
mtmp = youXiaoShuJu_QuZhiLiu[0];+ B1 y" J) Q" K/ y9 t
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {7 I/ x& ^. R2 h5 Q% `' P- {
ix = 2;
M! g& m9 G, j. k$ f6 Z exitg2 = false;
6 L0 b8 b- f( E4 n while ((!exitg2) && (ix < 81001)) { y. z- U7 K) M0 e# R& {
ixstart = ix;
& ^) G& X- V2 S/ f* X' D( H: | if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 h) `6 [) ^$ ~5 c; {3 E; n
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
8 Z+ d% c6 s" r2 D9 _. S exitg2 = true;
O: L; {2 c+ j3 k } else {* T- ^. @' I1 L, S2 r1 \ _
ix++;5 b. B4 V8 H' H# L. f& G% z
}3 j" y- I. L' D) ?. s
}
, J! l5 z; X d/ B/ S! _1 E }
& T; _6 z% l: u% F. ?9 _' g3 h4 P! \. d
if (ixstart < 81000) {
5 v1 }0 l+ I1 B5 n, Q2 l$ {6 f! {6 G while (ixstart + 1 < 81001) {
7 ]9 `4 Y/ w# f" I5 P if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
$ t. O: o! Z4 K, i. ^+ z& O' l/ D mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
1 j) F* B( F+ {3 Q/ q8 ?9 d+ Q" ? }
X5 i$ V& L% q1 {: Z4 b. w' z; K/ ]% R1 |
ixstart++;: N4 j( s4 S6 y& d9 D
}5 U# q& w H# V; }( e8 S0 C3 V4 d4 v
}7 R. d9 \) ?/ n0 W2 j. t; ^
7 Q, U( `! r: A& @: L B$ n ixstart = 1;6 g6 F \. @3 h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];- G1 }# j6 Z% V& y/ v- m. b
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# {; |/ p5 N$ l6 j
ix = 2;
# v/ H2 W4 Z6 T0 K: R exitg1 = false;
% G3 \7 d9 w( `8 Q while ((!exitg1) && (ix < 81001)) {
, U% ]; g6 f+ p ixstart = ix;
" [3 Y' [3 Q( ]9 R7 |( m& F/ S if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
' b1 e& q) k0 u; L2 f6 p; b yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
4 K; R! J) B& s+ Z. _: ~# @ exitg1 = true;! A4 D( L7 N7 _1 H3 y4 ^) R8 r
} else {
# F. I( a% a: b' f ix++;
3 _! _ |0 y0 U, K% n }" j4 Y4 ^8 I, R9 o, I
}
; k' R4 O$ D$ q! v }
7 p' z4 {9 I# U- s
( D0 ]; K5 {3 e8 F; Q if (ixstart < 81000) {
1 I2 g1 N! T7 C7 Y+ n while (ixstart + 1 < 81001) {" Y5 }* K& h6 m
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
9 n- I7 ]- \$ C. d yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];6 Q& R$ H' y \4 P6 n% j& f
}
8 T& X$ |: \. Y( q7 E" W& V7 s& b& x& h7 w; B' k; m4 C+ @
ixstart++;( {3 d* V9 E( H7 a
}$ f. z0 |7 @: @' H
}) y1 `( l/ I _1 C) o
- g. g6 G P1 ~+ l b# C( R, h
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
: R0 L4 g9 F1 R. |( U+ m if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
' ^4 t3 I4 n8 V% t yiDuanShuJu_mean = mtmp;
- {9 l* W( @: `6 _5 X3 b* m }
4 M4 P+ O$ Z8 y' p' p. |
2 _2 ~3 Q1 Y1 n' E# u3 d1 p /* 找出极值 */
2 X( }8 q C& D, c# b! b6 R for (ixstart = 0; ixstart < 81000; ixstart++) {- h( K* Q6 O& i9 L$ S: R. x) l
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;0 m7 S; p8 P8 M/ k* x6 T
}" t! \" Z# ]$ X7 O' H }3 |' j
/ x3 v6 r9 p# x0 C --------------帖子字数限制------------------
* _& S& v) n8 ?4 n, ~, x# W}
. l& _* \. c# b( Z& C! t7 {
e) I+ A* u& N( H* u- S( E# ]$ ^$ T8 @; u
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|