|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ) {) ~% n# X% O3 [% a! S
8 [: }2 }2 D0 X: ~" K) u6 k. o+ R& [
各位大神:( F3 k* v( m# _9 {
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
0 V9 O7 M% L4 h2 c5 J, A 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
2 V& ?- x X# |* g" @7 x) |! n
$ g( c- m. b3 X8 d
2 q" x4 B; G8 H$ a& A这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。) p% K8 X8 T2 U( M
& _4 s) J7 t: v& ]' n: I( N并没有其他线程6 U; |) i6 \- D* q$ G) [3 e
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。8 o2 e+ \4 b- I9 a1 w9 L
也说不定是和堆栈有关系。。。。。。
2 |6 P' B; J* l0 g7 k! Q T请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
' V* ]) K5 C$ d0 B Y. Z8 J& K/ x- S; u' K
8 T" y) J# V+ G0 H) E$ p# b0 n* W* ^4 m- D. G+ k& Y6 q
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
0 @ r8 F2 u9 \. d
$ {/ T7 K3 p3 l. s5 J
- E9 e% Z$ e4 |0 ^ L: a附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];8 w* K: i$ r7 R' I3 ^! F' l
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
/ F: e0 Y2 ^4 U' n" l7 @9 H, A _2 Q9 @6 G# J
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(5 j3 A/ }" U2 j2 @" X0 o4 W- ?
const double data1000[1000]) {: Y8 V, z* h1 w, g, k& u
, l) z1 i2 l. q% a2 k' a
int myfuck;! y4 F, ~ z0 ?; t( R! Q
double yiDuanShuJu_mean;
7 d, g# [( L& n+ r/ }/ x double yiDuanShuJu_LowMean[1000];4 P& Q+ F1 f+ ~/ d' |( ?
int ixstart;# f# }$ m4 D& f. c# A
double dv0[1000];
0 y9 ?: [5 \9 o9 c) N, J comm_AGC pAGC;
. F: O8 j1 M6 x# x; C comm_CarrierSynchronizer pFineFreqCompensator;1 x2 n6 _$ U- {8 ?/ C# ~ E$ B
dspcodegen_FIRDecimator pRxFilter;
* p+ {2 F7 ?2 I8 E, |9 s6 q comm_SymbolSynchronizer pTimingRec;- w& g; Z' m; A5 \" s5 o
comm_PreambleDetector pPrbDet;" G- p! b& U/ ~, F
FrameSynchronizer pFrameSync;
2 c- ?) |0 e; s5 f QPSKDataDecoder pDataDecod;8 a5 s4 I" J3 i4 b; ?" f1 ?
static double usable_left_filtfilt[81000];7 f3 y% N% q( g) k8 X p
static double youXiaoShuJu_QuZhiLiu[81000];7 S) L. H' u9 G* J% b/ L" H
double mtmp;' G" A2 A* {& V1 W, Y: M
int ix;
3 b9 G+ l8 u% N+ N; I. N$ p, b+ p boolean_T exitg2;8 X( y+ M* ~% J% X3 U1 v/ B! ^
boolean_T exitg1;; P% e3 s P- c6 e
double YiZhenShuJu[800];
1 j8 s! p/ W" ] double dv1[800];
3 N7 h5 F; D9 M6 Y& S* L, S8 \( M
. r" W; x( p- T- |+ ]
( w) @, j1 Z7 D ?5 _+ W double b_YiZhenShuJu[800];4 W2 l8 }7 u4 M$ K6 R1 B/ K
double I_filtfilt[800];
% f* [& k2 v8 R! J double Q_filtfilt[800];: ~6 n- O, b* \! Q9 T( V
creal_T b_I_filtfilt[800];
+ t: b% _ z/ [6 g% t creal_T b[800];. T8 y( r7 e2 E$ s' @0 M
creal_T RCRxSignal[50];
( q. M6 r4 f8 Z! ^ creal_T fineCompSignal[50];1 o" a# b3 C3 |: p1 d2 W( `
double phError[50];8 ?1 W$ b2 L: C
creal_T timingRecSignal_data[28];
# J* m" m$ w6 f8 D% d4 c int timingRecSignal_size[1];0 W! m1 k6 Z" Q+ t) w* {
double prbIdx_data[28];0 L7 r' |3 @+ C9 ^1 _$ N8 ^
int prbIdx_size[1];/ n& ~8 \; J- k0 ?( r( i# L
double dtMt_data[28];( W: _2 c6 C( D/ C
int dtMt_size[1];5 k9 A. x4 O0 a' O
creal_T symFrame[25];
, p% L+ F! p. X; F7 S X2 M boolean_T isFrameValid;
8 N3 ~- x' b& N: ^ double unusedU0[3];
* w- C+ D7 q- o2 j$ Y4 }7 D. x8 g" `/ @4 n w
//调试过程中的变量$ t2 _/ R2 a0 a4 G- j0 s; M5 \
int enough_data;
5 e* L7 R" d/ I R/ B& ]: R
2 K, Z2 s5 e6 I( } g' v; s int enoughDataFlag;3 K7 a. m' d& M& R
int yiDuanShuJu_mean_int;6 y$ D- [0 R: Z6 \/ S- {( q
int int_sum_dv0;' ~3 X) s. a* A/ B; Z2 b
int oo;1 l/ M5 ^. h9 a7 `& t. h5 }
int ii;2 b4 J$ Y* X1 k$ [6 ?
myfuck=10;
4 \6 Z9 o% o/ `6 d/ Q5 H /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */3 O0 _8 s8 D2 S& C4 f0 J1 ~' t: D
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
& g9 P& Z' Y8 T# b3 D0 M0 h% @2 D0 Y, X; ], ^ v7 |0 {- A4 M
yiDuanShuJu_mean = mean(data1000);
- K: E" M0 c/ ~7 r0 c% F% [) m7 T$ p9 T- P) w; H8 q
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
1 j/ [9 n. w+ a8 P" s3 a UARTPutc('A');
9 K7 e [+ y" i3 j" K2 B+ v UARTPutNum(yiDuanShuJu_mean_int);
/ G1 {! Z$ x3 c! x. b. B5 Z% K UARTPutc('\r');
' O/ f. H' ^- S; S3 ?7 t& c UARTPutc('\n');; W4 e0 [ `& E: w7 v! I
: F8 M* Q+ x E2 D* T+ @3 k! u for (ixstart = 0; ixstart < 1000; ixstart++) {0 X% ]0 ^# V5 C6 ?2 |. ]$ J
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;8 W9 d3 M, x- }( A% @5 ]
}( J+ R: Q9 ?" Z' l- U8 V
" R2 p I2 T6 c+ B9 Q1 o, ?
power(yiDuanShuJu_LowMean, dv0);* b& \ u" i& y6 Y" D' H2 p! t
# _9 k/ g" S4 T! C2 j1 w) N
int_sum_dv0 = (int) sum(dv0);! l5 R) y# P8 u( w j. w( N7 {
) N% z$ U0 d7 f7 ` UARTPutc('B');
0 ?$ _! M- ^. a, v UARTPutNum(int_sum_dv0);4 J+ y4 \1 o6 u/ \
UARTPutc('\r');
. b+ @, R. {: n; k3 F% H1 r) K UARTPutc('\n');
$ U9 |% w O; X& j& f0 M; x3 V) l9 H
/ m5 e/ g4 }& C: T9 O2 Q& F" }' @" H// int compareFlag = int_sum_dv0 > 1.0E+8;
4 I; z$ `3 @# Q3 _; _& ~/ O! h: u0 O8 V8 z; K' D7 Z! ?
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?2 Z, y) y5 i/ O+ L3 g- o
UARTPutc('C');. [- c# V! J# F; H$ j/ h8 ?
/* 比较信号能量 */
; s* m: A4 H/ `. s /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */! A" q7 q5 |0 U+ ]& S+ @; P
// yiDuanShuJu_mean = 1000.0 * youxiao_k;* R* L( Y6 ^) Z* K: U+ m# P
// for (ixstart = 0; ixstart < 1000; ixstart++) {3 R. m) p+ o! Y& b) o2 S8 d
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
2 r9 i$ O" w9 T! {. }. ]: ~! L: g// yiDuanShuJu_LowMean[ixstart];
/ g( R, ^! ]' I6 S$ H3 H; q// }
9 b8 j: p/ J/ t- z; d% |& ]//
2 W1 @* n3 w4 l// youxiao_k++;
j6 j, s- B A// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==! t: K" h1 i: _
// /* 感觉要取21个数,即0-20, */
1 Y; \1 o7 {$ H- y# {// enough_data = 10;//有效是10,无效是0
8 ?9 e$ Y( o8 R// }9 B2 f G) O& s3 V; v, z! T+ \
}
* l# \5 a1 ]( D5 ^
; J; _' K$ B/ l, F& K# G. V4 o' N: t
enoughDataFlag = 100;
" z G- l" o( V3 M' V( }- I enoughDataFlag = 1000;, A) T2 i0 P$ r# b
enoughDataFlag = 0x02;
- E3 v/ n2 z! c W$ ` enoughDataFlag = 200;
6 s$ C7 t* \1 o9 `* ?; F8 z# i2 R* V7 d6 d' Z
int myfuvk1;
2 d: h% \3 x- Y {1 a$ e myfuvk1 =11;( `5 b; V0 v- ~1 z
# b6 I! F m6 X- t1 e0 r! g
+ c! G9 q: x5 ]" X. Y( `1 {7 f: ~
enough_data = 0;" E. _3 G7 P# ?6 c: u- I
8 f7 J7 |2 {$ p. v% n% h8 ^" ^// if(enough_data>50){. h/ [. x% X4 t) C
// enoughDataFlag=0x01;( {" T P, B$ u4 U% g' Q
// }else if(enough_data<50){
6 @9 Z3 i* M. Y: r3 r// enoughDataFlag=0x00;//0x00还是不行
" p% J' a: W% _9 O) o, z# P// }
- g* p' y" c0 |: b
! P3 ]2 e% b7 T2 y& R
0 f. G( e& A+ Q* B: g oo=10;+ i1 B; N7 X6 u/ b! d
oo = oo < 5;
( j/ g7 U0 F( ~6 m if(oo){
- E: \8 s2 Q4 ^$ e/ U/ @0 m5 V* J ii=0;
- h ^2 i0 U6 e1 x* q+ b }) w6 n$ M5 M, I4 }& b& Z" u( ^% O
if(oo < 5){
" ^$ }4 {9 U9 a ii=0;! ? _9 S7 c: g) ?( v& a
}
- g* I% G; W7 N; x; A0 ^5 q if(oo > 5){
2 u& t% U2 m+ m6 _5 V: t ii=0;
* o) {0 t- n' m+ d0 P$ ` }
$ K! b; w! w4 k' `) Z+ e: T- g1 G3 s5 X% `
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */9 y* ]3 H% T( g4 c- x
/* 如果数据足够才执行主程序 */. F8 z2 d' N0 ?0 ~- O0 I
oo = oo < 5;* U3 b: @' c& C6 ]* M0 t
enoughDataFlag = enoughDataFlag < 5;7 Y# W% Z6 ^7 \+ ^" L
if (enoughDataFlag < 5) {
- `) J5 t# M+ c6 \// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是01 @" ?. ~1 t, X7 U6 `! u; w3 v
AGC_AGC(&pAGC);
8 `' O! r% }: y- X1 ~, d$ X/ B
7 g5 C0 ]2 S8 F/ G$ q Q8 b5 S. A c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);. v0 o* z8 m, V2 J6 ?4 x5 {9 |: \
FIRDecimator_FIRDecimator(&pRxFilter);
, c: k# g: b# {5 H) b S
! E% I" l: B0 x3 z: u /* Downsampling */
' h3 m" a9 G0 M" f# }: L0 c+ f c_SymbolSynchronizer_SymbolSync(&pTimingRec);- z$ }* r( e, A- R) k
2 I$ [& N9 \- r6 m; S
c_PreambleDetector_PreambleDete(&pPrbDet);' Q, H9 `$ F2 O" u0 f% W
4 \5 x, v' B0 f /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
$ m; \3 `- f) j) b2 G! f /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
s/ ^/ h4 P& f5 Q1 _6 E" n" M# D# S /* %帧数量=100 */; t) `/ R) d& m: H0 T* I0 z
pFrameSync.isInitialized = 0;
# a3 C+ U/ j! K! U% S! Y/ N) z- w1 ?" E
/* [EOF] */
1 F7 W6 K% }2 |* q7 B. S /* 前导码长度是13 */4 f+ r8 u, o, Y8 n2 d; A
/* %qpsk */3 k& E* ~$ d L/ F0 R/ F6 d5 t
pDataDecod.isInitialized = 0;
& b U' M+ j& E8 M7 B: O4 P
( y8 g; p7 K0 Z( H: i5 e% ? /* end */
2 h7 r/ ~' L- g G7 A, P5 C+ ?* j /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
/ m' n7 K& f E( p( H0 Y /* Convert 3-dB frequency */
: I7 N4 B4 I* r& q' N) T5 g( B; p. X /* Convert 3-dB frequency */
: z) c: n0 o& ^, I filtfilt(save_buffer, usable_left_filtfilt);
/ z5 B3 K( [7 r/ N! }( F for (ixstart = 0; ixstart < 81000; ixstart++) {
3 n `- s [ T! D0 O+ L7 i$ Z4 \, Q usable_left_filtfilt[ixstart] *= 2.0;) K0 I# O4 I- W4 ?4 `
}( R6 e% s6 r! Z) ^9 o
. z% ]3 Q) }0 f9 O7 K0 c
/* 注意乘2,处理幅度 */
& a" C, x7 v5 w5 `4 I$ W /* %% 我发现带通之后其实就均值为0了,不用这一步了 */8 Y$ H8 G8 g l1 h
/* %% 行列转换 */1 f' u- r: l# z: [
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
, p* c$ O9 }$ ~: z for (ixstart = 0; ixstart < 81000; ixstart++) {
" h+ l/ ~. G3 O) t& @ youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]3 v. l O1 b+ G f# [) `; y9 ?
- yiDuanShuJu_mean;/ z# Z# O# r7 L1 J6 }6 s" Q* U- b
}
0 s. n5 r. c3 Y! ^1 s$ p# I5 T& Y' c( |0 d8 h
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
, n! \+ n( T! O7 H' h9 q ixstart = 1;& L. @" ]) N+ m; l/ Q4 S
mtmp = youXiaoShuJu_QuZhiLiu[0];: }2 A9 b6 z, e9 K
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
4 O- n1 `8 [" T: P: S ix = 2;1 \. M$ }/ B/ m7 r6 D
exitg2 = false;' N! K+ [4 k/ Q1 Z
while ((!exitg2) && (ix < 81001)) {
0 r8 m* ?$ t8 p8 @3 m5 l* v9 i ixstart = ix;
2 g1 @/ Z. x1 k+ M K8 r if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
1 `3 W7 g# u$ c8 i' j c) h mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];2 D9 Y( z" l( Q! W+ g* g7 I, e* V
exitg2 = true;! F) K2 i2 d9 t8 O& k0 t* c4 H0 r
} else {
; M" E' {2 C2 X/ I; y& d. z ix++;
% _( \7 Q' L% P( ` }1 G% M- e- Y4 C" I( D* G7 J F
}
- b4 s9 R9 G4 T. e4 ] }) l& {4 @$ L, W
3 K ~' X0 b! v
if (ixstart < 81000) {& `+ k9 Q, q* @4 D$ F
while (ixstart + 1 < 81001) {
, b3 h' [0 c( S% U% ]* j& K if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
: p6 k, z8 T1 `& k; l4 d, J0 ~' B mtmp = youXiaoShuJu_QuZhiLiu[ixstart];- N* O! g4 R0 |: m+ u
}6 }. _6 ^0 t7 v- d
+ l ^7 }6 R2 t2 P2 l+ b
ixstart++;
4 S% t; y' w, B# [/ C, o. O* x }
: B. M8 g, N$ K' P' q }
4 h5 L% t' `& z# k* }8 n- z! ^9 W* I9 F: r- n
ixstart = 1;
$ P# P0 T/ N# ^9 Q' ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];$ p: V. A" C8 a, }$ B, Q9 |
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {8 u. L( U/ @2 h( p4 F% ^2 B6 \: T1 T
ix = 2;: W& M! s# {$ F, C: P
exitg1 = false;0 [8 h! G0 _% M) G4 Y" Q
while ((!exitg1) && (ix < 81001)) {. f& L w1 @4 C) w" j
ixstart = ix;/ Z& {% @9 {3 @4 p4 {, B: P) Y: B
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; ]* Z& _+ W2 X& H7 z9 q$ [ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];- Z& y: Y& u( A' O; Y W& S, @0 X
exitg1 = true;
- I8 _2 Y" s O3 L7 T } else {
0 Z! S( I5 M8 u. K9 F ix++;
% {8 V4 m/ B5 H- `! t D }2 N: k! k; b7 [) r
}
' A5 a2 {2 P2 O$ n }# w v* M0 k; o# l
6 D' {; k% J9 {5 k7 G if (ixstart < 81000) {( t# E0 K) t; _8 V/ B V
while (ixstart + 1 < 81001) {
8 X* H+ u+ h0 ]# s+ U% m0 q) N2 v if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
1 z4 e. L% e# P: K6 T6 [ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];2 h' r9 C: F, K% Z, V. X9 Q0 Y
}
" y. ^4 ]4 `- e7 i5 \0 Q* Y
7 K [. s4 R1 \8 ] ixstart++;
5 G7 G5 i/ l( [3 [ }$ T% {- \8 |' X+ @
}
. x' J% O) ~* L% \# N7 s2 ^1 }6 w0 b0 Y4 b2 U
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
, `3 a: e) v5 X. O8 H' w% j if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
/ Q# h0 m0 }; L! h4 c7 O t yiDuanShuJu_mean = mtmp;
% O, w3 l6 f; m& C }" B) f( A! ^* u! F
! d) w) g) H9 P* S
/* 找出极值 */
" T; `; ^$ D5 S% L$ F! M3 b2 j for (ixstart = 0; ixstart < 81000; ixstart++) {/ J: B& f7 O% G$ g& d& E O& o
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;/ g. U2 F( \4 B1 W: ]6 i2 f
}
/ ]! A) \# R3 ^& O, U( {1 s) U7 |, d( h% n3 G% v1 d
--------------帖子字数限制------------------# X% T$ w+ b+ T& Z
}
) v4 c1 P6 W: X+ G( j7 D1 r/ [$ S" w' ^, k- s8 E. \
/ ?- M! l* B- T5 M1 q' i( m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|