|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ! X; r' h3 x2 m" ~) D# M7 k/ D) k
% R( v+ t- R* C. |1 e2 |& _1 w
各位大神:- C7 u2 X1 T Y# H/ V6 S! T+ Q2 g
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
* h1 {6 |! a, r2 { R, \2 {) p9 \4 X 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:% c! Z2 ?+ [) T' k8 Q
) ^6 g2 |! o7 e/ d; Y; T 5 D. P+ ]* R2 Y( \0 ~. p" g, o
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
3 n- d/ i1 u0 p# D" S
; V) @! F! j$ T3 B, k. |( _并没有其他线程- s( G) C; @& J% t
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
0 D% ` N. j3 e/ v也说不定是和堆栈有关系。。。。。。 B( \! n' M4 G: l% A# G
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
1 c9 E& [! f. q) C" r5 O' i4 S0 ]4 ~. z& N4 Q
& S- K* D- c2 T, l( x( z* s: c9 z% Q% i
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
) V4 Q5 B: q3 s. e! b
' s$ ^8 V" G5 o
" h8 t2 u* q+ u) Y* K0 v. A, R附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
8 y. f, v: r* Y3 n static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 x3 n4 x6 R- Z( s) B; d( U8 S; t J2 W$ }0 v4 x# ^- E4 J
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
, _; X$ M9 |# y8 ~/ }3 W& u const double data1000[1000]) {; s L% h/ }* C( @. _( r/ B# y
) ~! i& b* q$ q
int myfuck;
! l { q# D7 n# }" r& X double yiDuanShuJu_mean;
a; B# E: x% U double yiDuanShuJu_LowMean[1000];. L2 ^/ |9 H! O5 _2 w
int ixstart;
1 i& I9 B" g- s; k. U# h double dv0[1000];
3 K, i# R. F+ h6 u5 t3 m comm_AGC pAGC;
% |1 e X, D/ }3 t% t! p* l comm_CarrierSynchronizer pFineFreqCompensator;
( [' X- o6 w% j# b0 p0 ]$ P5 R+ U dspcodegen_FIRDecimator pRxFilter;
9 J7 R2 ?) _: V5 J1 ^0 q comm_SymbolSynchronizer pTimingRec;
7 f2 V ~3 |5 d+ [; D t4 W: e" l& u comm_PreambleDetector pPrbDet;# p. j8 Q% Y. t) {7 a) Z
FrameSynchronizer pFrameSync;
7 S8 f8 L/ A9 ? QPSKDataDecoder pDataDecod;! N: P8 v c9 d5 N5 p7 S: Y7 s" ^* m! S
static double usable_left_filtfilt[81000];
$ f U) H7 c8 E, b static double youXiaoShuJu_QuZhiLiu[81000];2 J0 C7 i: p7 U1 K `$ j" U) T; Q9 o
double mtmp;9 U8 ?+ v& {1 x+ ]
int ix;
( S% ]9 N: z% F9 F( G* ? boolean_T exitg2;6 z |5 @0 \% t, u' r+ r
boolean_T exitg1;7 [5 w' H) h3 ~! U. I1 Q
double YiZhenShuJu[800];
/ T4 P& m5 N* i* c" l double dv1[800];
: @. j' f, ?& `' A4 p
, V, p# v, r! r8 d Z9 o8 h6 _9 U7 m, d
double b_YiZhenShuJu[800];+ \' |. Y4 V8 W- B# T
double I_filtfilt[800];8 @5 A, p' K6 H2 J- K4 K3 t
double Q_filtfilt[800];+ n6 _" N! _8 s% e* R4 K# w
creal_T b_I_filtfilt[800];
* T" X1 k5 ?1 V& C) @ creal_T b[800];
$ w, Y7 i$ }' ^+ y2 E o5 j creal_T RCRxSignal[50];
2 q# a$ o: O- N- p1 o* k creal_T fineCompSignal[50];2 ?$ |4 f p" g0 ~; @
double phError[50];) j) f9 U N4 b. C' e4 _
creal_T timingRecSignal_data[28];& Q+ Q u( Q* X& i3 k- m
int timingRecSignal_size[1];
) H6 e E/ j- u3 ~! y/ X6 E double prbIdx_data[28];
: \3 b! B/ R5 [3 ~) }0 z" f7 k int prbIdx_size[1];
: @9 B, n8 o" T+ p2 j0 r" n double dtMt_data[28];" e I3 I. \3 |( y) R
int dtMt_size[1];0 D/ y+ p! ?' Z4 x9 B: M8 J
creal_T symFrame[25];( u ^/ _# d& f7 N+ c
boolean_T isFrameValid;9 Z. L4 _' j2 J
double unusedU0[3];
4 W, \+ r6 L4 I4 J, A
% f+ @* r# K' y2 Y/ S //调试过程中的变量7 ?3 x1 ]$ p3 ]) t2 @0 o- f, P
int enough_data;. h* s1 k& }1 O
( r3 o4 X* _- V( B# c
int enoughDataFlag;% ]! a* w' m8 G/ M% t8 a3 `: ?
int yiDuanShuJu_mean_int;
) R* S( ^: f6 ?& V+ b int int_sum_dv0;3 m; e. _) H; v
int oo;
' H4 ~5 r/ g0 I6 U: m: x8 c int ii;
! f( b1 F4 E& G6 c9 p myfuck=10;1 K6 g( U& W1 `
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */2 F- t% U/ }& S4 J# a
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
, @! E# z% p+ E
4 r9 g W) f$ x0 \1 E! `3 W* r yiDuanShuJu_mean = mean(data1000);
1 C+ U6 i1 o/ j( E1 P7 s
: P# K+ {& ~; W8 [+ r yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
7 n3 @$ m. S8 ^. | UARTPutc('A');
1 {1 P; D1 O D _0 n6 z! ] UARTPutNum(yiDuanShuJu_mean_int);, W& E6 u' F9 P2 R+ o
UARTPutc('\r');% Z* O/ \: }1 p8 [
UARTPutc('\n');
0 H1 r d4 t D& t% \' r0 y
* f2 [0 n& l1 I5 m5 o% L3 ]' Q. w for (ixstart = 0; ixstart < 1000; ixstart++) {
0 V. p! P5 S; K# N* {+ c yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;3 u: b( p7 w; Y8 B; _; R8 A: D. O
} Y( c. |; B3 ^2 H! s! \ t$ I
1 R3 j, m; c: {: b# l7 s7 t5 T power(yiDuanShuJu_LowMean, dv0);
2 ^: ?8 a" b1 a# w; l" d( _
0 n: y/ }6 ~# H% K- ]% G. W0 x int_sum_dv0 = (int) sum(dv0);+ t2 N# J+ D% L V+ N! T
+ L' K! P* P, K9 \8 k UARTPutc('B');: \* T# O( y3 q! r' y/ a' W" o
UARTPutNum(int_sum_dv0); D+ X/ \- W- j) E# T
UARTPutc('\r');+ l( y# W! m4 v& n, X
UARTPutc('\n');
3 m6 J4 ^- ~# s
5 \7 z" ~' F, B4 Q' G// int compareFlag = int_sum_dv0 > 1.0E+8;, y% }' ^7 X3 N9 t% p! E
2 g9 x0 {% u0 l9 N9 v
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
- |" ~; }+ N$ _/ D! F UARTPutc('C');7 G; X$ D. L) f
/* 比较信号能量 */
1 R: F E0 @3 _; g G) B8 ^ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */$ R7 e, l9 C6 J# {2 _4 `0 y
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
( H+ S8 @2 W& Z4 V8 T// for (ixstart = 0; ixstart < 1000; ixstart++) {, W& B7 }3 C# x9 k
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
, @" u: F/ V. u% ?// yiDuanShuJu_LowMean[ixstart];
* [' c# L; [7 e/ H6 x0 \5 X2 J7 ~// }! T5 |, @/ u; j( h" M
//
, [5 L+ N9 d$ V* y: B9 G7 P: t+ a" \// youxiao_k++;' W6 F9 n2 o* C! q- J0 [* I2 a
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
' p8 {& W' C; ~ c" K// /* 感觉要取21个数,即0-20, */
: L0 e9 k0 y2 X# [5 ?, Y// enough_data = 10;//有效是10,无效是0
9 y! Y3 T* j& L! d/ i// }# ^. r! L9 v' N( P8 v/ _
}
3 r; H8 ?0 T/ W4 Y
2 w5 o" n% P) k" R+ k
9 P" P- }" v" E, D1 r$ \ enoughDataFlag = 100;( C) `# B, D1 v( E# b# ?8 e. \1 U. D
enoughDataFlag = 1000;# r9 s/ F) O: V5 H
enoughDataFlag = 0x02;
9 S3 P; k3 N' y; D/ z8 U& J enoughDataFlag = 200;
7 w, a: f/ t, E9 f8 w8 y. s! l7 y" d6 t+ A
int myfuvk1;5 X+ {6 ^3 ?4 a7 v# U" G
myfuvk1 =11;
" m3 \0 O; m* l" I0 ?' l' w! W, u
2 d$ S/ k3 J1 g4 i" Q$ r$ T0 N+ M0 F* s
enough_data = 0;; A, [0 ?1 j% l9 r) @/ k% ^
% S% ~; W" p. ~1 d* n// if(enough_data>50){
1 l9 C) `- i) G3 A$ L& m// enoughDataFlag=0x01;) h8 i8 J3 y9 w1 P
// }else if(enough_data<50){, J" v! ` Q3 r
// enoughDataFlag=0x00;//0x00还是不行5 G, Z+ e: d. L4 R0 e& m
// }6 @- q$ z5 ] S; ^& {" d' y
: t7 f5 `5 i+ j: v3 k1 e% P0 k
Z C! N2 d) |6 y" E oo=10;- s! N! I* w8 T- H8 s/ O7 V6 k. L, `
oo = oo < 5;
6 n; G0 r8 D% ?9 X. [ if(oo){( c3 C5 M! { m. j9 Q& [4 Q. K% z
ii=0;" r7 W3 b P9 D" A2 j* {! @: l; h
}2 b6 ^' D6 d' F5 a/ U* @5 B
if(oo < 5){
/ i9 K/ q; h* H+ [ ii=0;1 @" O J- o9 Q8 |
}
4 D) Q: F% V2 O" m8 l# o if(oo > 5){
# N* P9 i$ S* w! d4 N7 p2 z- g" T6 O ii=0;* |- U. \4 X* y! l$ p& d
}- X! e$ ]# d) r! \0 v
& U! p* {/ p* F+ P" m" z6 G2 } /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
. s8 y% B% w8 z# @" b /* 如果数据足够才执行主程序 */
9 ]- B8 M* ~' q& N5 u1 N. q c4 j oo = oo < 5;
1 k0 b8 K1 F9 V/ n) R' v' z0 u& f' v enoughDataFlag = enoughDataFlag < 5;
9 Q" K- z5 g0 u/ p if (enoughDataFlag < 5) {, ]( E: |# j4 _4 \$ v3 a
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0' N# B5 X$ a3 _) |2 ^3 R3 K
AGC_AGC(&pAGC);( y3 [: P: F* {2 ^6 H3 a
1 B+ a& F4 \3 Q
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);& [6 m# ]; ~! K! D
FIRDecimator_FIRDecimator(&pRxFilter);8 r+ R# M0 `! p5 _# d& j @
3 J6 \1 G) F/ v
/* Downsampling */
' R( `2 \3 c' r; Z4 v, \9 T c_SymbolSynchronizer_SymbolSync(&pTimingRec);! {& X5 }4 e0 ], ^& o
. a% m9 F' p Y- c! n H0 m+ U3 t9 u c_PreambleDetector_PreambleDete(&pPrbDet);3 A. x' P+ A/ D
: s" K! v& N& s2 n /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
3 {. a/ N% Y( A$ y3 p# k7 D /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */6 T. ?/ [- x4 s; X A# T
/* %帧数量=100 */
$ m6 Q" T. t; q4 ^& v& m7 w2 ] pFrameSync.isInitialized = 0;
! H& z- l2 u% f, E/ \
$ @1 p% a" T: Z /* [EOF] */5 C4 \/ l0 W1 W! B8 p
/* 前导码长度是13 */7 g5 B' s' K; Q3 p- Q; I8 [* U# U
/* %qpsk */
7 v* W2 q- U0 t/ @: x$ X7 U T pDataDecod.isInitialized = 0;
9 l- N- V0 h( Q6 F4 M. {- u- p8 Q* r2 g, W" J* _' w
/* end */
" z. [- Z6 v! t /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
! ] Y( @/ _* C$ U% }1 V, u: v /* Convert 3-dB frequency */0 Z' S% D5 S3 G& Z9 S- y+ I
/* Convert 3-dB frequency */- _, ]% Z0 e$ K& [& }
filtfilt(save_buffer, usable_left_filtfilt);* Z" a: s7 { n: d1 C
for (ixstart = 0; ixstart < 81000; ixstart++) {, ~6 W( w* h2 U
usable_left_filtfilt[ixstart] *= 2.0;4 n% c# a5 W. @# H9 t7 R2 Q3 | B! A
}$ m x) h g9 G/ \1 Y: `
. @( J1 d. o$ D$ J* e
/* 注意乘2,处理幅度 */
& M" A/ I+ _% C @4 ~ /* %% 我发现带通之后其实就均值为0了,不用这一步了 */3 I9 O* b8 B8 x }
/* %% 行列转换 */4 e8 s/ v" B( O- B7 m, C. U
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
% a& V: K4 @5 J b. H for (ixstart = 0; ixstart < 81000; ixstart++) {/ a3 f7 N- l+ g1 j5 i- J
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]; |+ k- G" u. |. _" ?2 k
- yiDuanShuJu_mean;
4 _% \) K% ^6 J) G# @' G @6 f3 ? }7 v# z+ r* c3 h2 l) @) u% C6 r
+ Z0 F9 k7 N" ?. {& h4 C8 m; k
/* %% 应该对数据归一化,但是这一步放在哪比较好 */! U+ v7 X% k8 t3 ~/ i+ o" z( y8 z
ixstart = 1;
5 p' K3 }& p2 i# t; R! ] mtmp = youXiaoShuJu_QuZhiLiu[0];
& k0 V6 Q3 A% ^5 G \ e# M if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {/ ^! ~: ~; D5 ?" |; g
ix = 2;: `3 G8 E9 J$ V5 U% O4 @- Y
exitg2 = false;
$ L1 ?* s8 M6 f, G/ N while ((!exitg2) && (ix < 81001)) { |, d5 g1 Z$ f
ixstart = ix;
}9 o1 n; a. T3 H7 O- S if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
: _' @ M& m' P- |8 A1 z) \ mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];' b% C0 d& ] Z& a. d+ @. f
exitg2 = true;" \6 D" ]! K# a3 {9 ? @. l+ e
} else { q. K) S. @8 F3 |
ix++;# J& N- W! ~, s7 |/ B0 S
}9 ?$ e+ n' }# R0 K) [' V0 d' }
}8 V1 {8 I% @: J! G& l m
}6 n7 }9 U( Q h% x3 H& ` K4 B1 o
7 W# x4 U$ s8 \7 B' }1 _0 ~
if (ixstart < 81000) {& ~9 ?8 B1 z* J4 C
while (ixstart + 1 < 81001) {% F7 W/ G( @6 i* y: l' U: L
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {7 _( S, L" i B6 |+ d
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
2 Q0 s2 ~* Z! q" ~: w }7 w1 s# ^) X' S) p/ n4 |
4 f2 ^' u* I0 ^: V5 @
ixstart++;
$ [0 T$ v0 K1 D8 G2 |# H7 D }
2 a* d, i. ~7 P" g }1 [7 D1 }8 s) } o- Q
) N! o$ e5 N& b/ G
ixstart = 1;9 g. N3 j0 O2 l6 h( P
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0]; W8 B0 ^9 F C% s
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
- f+ f0 ^% S4 U" B! b* B: B ix = 2;( S; R6 c; V- y8 N
exitg1 = false;4 D/ B4 X/ Y; {1 I
while ((!exitg1) && (ix < 81001)) {
! x6 u) T4 ?3 P7 [6 ^3 Y2 ? ixstart = ix;
) j" H3 @4 C" d# @8 v if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; U+ x7 O& b& O0 |. N yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];0 b" p6 H u6 i- v# C
exitg1 = true;2 r9 G# a- e% k6 g
} else {
2 h. }3 z) j& [& A5 t& n7 @6 A ix++;
3 a5 s1 U1 s+ m2 G2 V1 d) Q6 @, { }7 _. S4 I% w, T+ H6 Y8 A/ Q5 R6 g
}+ {4 N# P7 k9 |# @5 w8 R0 e* u8 W
}- o6 T( F3 b" Z( s$ x
N$ H' H Y" O. P0 T5 q if (ixstart < 81000) {
3 d1 ~4 X4 |- {8 Z3 C* j9 b x while (ixstart + 1 < 81001) {% s# P* M2 ]& l$ y. M
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
6 v I9 _% n" s: c4 \3 W5 x- O yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];9 {2 V g$ i; ~
}8 Q' r6 n: F+ o0 g, X
" `* D& z& i) f, v: J$ ? ixstart++;+ y% ]+ z/ u% o5 u- o
}! m2 s( `' r7 j) _7 o: @
}
; K: ^1 x) b; e+ @4 }1 z6 n4 e& g y; k. j$ `
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);9 Q% s8 r$ x4 Y( Q- E% y. I
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {6 @5 g2 X4 |! J, o8 f ~8 F8 G
yiDuanShuJu_mean = mtmp;0 I4 A7 \$ @7 Q5 `0 b! Z
}7 C% @2 a1 {% v9 {
+ D' a+ i2 ~4 X
/* 找出极值 */- f) G3 R5 t7 j4 k7 d2 {. r& h
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ f# j, M8 \0 z; } youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
9 |0 W) Z$ @9 L7 m) d }" \. e. O# g3 m$ [/ d* n' u
2 P( W, E" h3 N. z% L! S& {( o
--------------帖子字数限制------------------
+ C, Z5 q; s& u7 _; p6 F: t}
% a8 J* e4 v5 _% ]- u. w5 C5 o( l, c* B; g# j. X. O# G6 n
; `$ g Q' }! w, E# O: [ g" x |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|