|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
) ^! t1 c1 e. B2 a6 v# H$ e( U% q( N' x C0 F
各位大神:
. i+ |+ @% T Q 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)2 }, g, ^/ n0 f. L k. B
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
( W4 U7 g9 Y0 ]' S0 g) v! ~$ f( n! n8 f( F
* `! @' L" w9 ^$ N/ l' f2 t这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。0 I" \; d* j3 v9 n+ M% f9 n# p# D
7 O4 R1 M' g3 K/ I- |并没有其他线程
$ @+ H7 E' i4 T. C; N反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。6 \6 h& h8 \# s6 l
也说不定是和堆栈有关系。。。。。。
- i+ o; R! V$ ~$ u$ Y请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
( Q$ ^1 {; ~6 U/ W5 `3 a! I8 \- n1 `; N5 f2 m- p
) `$ a, P9 u- z( L3 ~' ]# s h
$ l/ w8 i, O$ n6 }4 U
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
8 d' O1 k" T( ?; b6 K
2 m6 f# S$ G1 n/ J1 C
( ^: \8 N5 R% ^+ y6 }附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];( ^6 @$ y5 h. u0 z
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
( E% ?+ G5 @1 n {+ r; B
6 o0 O0 T) e5 e5 P- kboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC($ \4 }: {) y# U4 o; `+ J# F
const double data1000[1000]) {- e3 ~/ F4 d0 l. b$ v4 S, K" ]) D
. X0 D& b8 Y( }7 q: X4 h) b
int myfuck;
{' h# ~1 [8 f; g% P a& s double yiDuanShuJu_mean;
+ h* v" D. Q; e3 L# l; S; \ double yiDuanShuJu_LowMean[1000];
9 ]& h8 i( Q7 x% G; E) o* ?- O int ixstart;
( j) X( n3 M! ?* x( i double dv0[1000];5 f" d) I% y5 x" p9 I. Z- U
comm_AGC pAGC;
1 V6 q( f5 l- f' ?8 ~& [5 O comm_CarrierSynchronizer pFineFreqCompensator;% f8 M3 q1 L+ c
dspcodegen_FIRDecimator pRxFilter;
! j) Z, F0 g. s0 z9 S comm_SymbolSynchronizer pTimingRec;
# s0 i; g) S F; q: l6 Q( S V comm_PreambleDetector pPrbDet;! ^' ~% h. }4 e, n
FrameSynchronizer pFrameSync;! T0 }, ^. H: _! ^8 q: C
QPSKDataDecoder pDataDecod;! p2 L. t9 Q* m3 j! j4 @( w
static double usable_left_filtfilt[81000];
8 L/ U: w- f9 Z H5 } static double youXiaoShuJu_QuZhiLiu[81000];
0 ]& ]' K2 d, F+ V9 V double mtmp;4 U3 D- V8 a! N
int ix;
- @6 M7 J1 |, j" b p boolean_T exitg2;$ E' K2 }/ V. _
boolean_T exitg1;
% P- M5 `8 A' m: o9 V double YiZhenShuJu[800];% {% x/ b2 h6 m) ?1 p" Y( Z
double dv1[800];
7 | s% N5 X, o( g8 Y+ [7 U5 W" Z' n+ Q6 h2 S4 _
- m: r4 q' f. c+ s' o3 m
double b_YiZhenShuJu[800];9 l) h$ Z& Q: x4 }$ E9 K
double I_filtfilt[800];, o( }0 p) H# x
double Q_filtfilt[800];$ w2 V5 v3 P W- B, Y6 x- S: T% {
creal_T b_I_filtfilt[800];
- t* x5 S- E0 M8 y% ~( J creal_T b[800];* F7 m- O: ?; U. B: `: f
creal_T RCRxSignal[50];
& d& S$ F3 |9 f( I# [ creal_T fineCompSignal[50];
1 n& S: Q. q& Y9 C; U& i( v, z double phError[50];
6 |! }2 s, h) E1 u/ ~5 f* U creal_T timingRecSignal_data[28];
) B2 f* r5 J! T) I/ u" p int timingRecSignal_size[1];
8 O9 R$ G9 S% a# W double prbIdx_data[28]; R* V U3 f& H* x
int prbIdx_size[1];
/ C: ]" U4 g+ a6 U% R double dtMt_data[28];
$ W: k }3 p" W) }* c5 K1 Z8 h int dtMt_size[1];
+ c, \5 o/ U& E7 S; D( A, l creal_T symFrame[25];
$ s3 P+ O! k! F" u3 K N$ E4 q7 T boolean_T isFrameValid;
$ A& K( o8 K$ n9 ?6 ? double unusedU0[3];
- ^ w. j, x2 j2 O2 \
1 x7 ^* Q$ _. i% j; E //调试过程中的变量
. J2 A- s! N: X6 c; Y4 N0 L% l int enough_data;0 n: x8 ?( \: Q) H; ]9 Q4 w6 }
* p% b. Q1 a; J( s* }1 e; d int enoughDataFlag;4 Z% i" e F5 ~7 M/ h
int yiDuanShuJu_mean_int;
1 _6 N% f7 s3 Q) D2 t% E int int_sum_dv0;4 n5 k( D+ @, S/ T7 i2 D1 m
int oo;
% e- L' U; i% `, T$ N( Y; v int ii;
2 u2 p% p# P% ^$ e( [' W myfuck=10;1 U- T2 T5 v2 i6 A. x; Q. ]
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */: R: v/ A+ g5 A! P8 ?1 C& v
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
+ b5 l% C+ n( u3 R! u5 l: G
, f7 B' {% f+ u/ e% q7 `$ ] yiDuanShuJu_mean = mean(data1000);# k$ B. ?5 x' M4 {; ^
K' y ?0 d# x' o, F& k h
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;( p2 F! C' X( z Q; T2 q
UARTPutc('A');/ a& U8 o! r& M5 A3 \/ K7 m n
UARTPutNum(yiDuanShuJu_mean_int);
" H N8 @% r& f* o) t UARTPutc('\r');
6 \1 ^6 K* J; ~+ c UARTPutc('\n');# e7 N" X& f4 C1 q4 B4 q: A8 J
% t5 t2 ?! ^* `5 a3 D0 J- |
for (ixstart = 0; ixstart < 1000; ixstart++) {, U" ?' K4 N& p' q
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;" ^7 `+ f$ O- S+ a* W6 g
}5 o& M P" f8 c5 x1 U" n2 ~
1 h, Q% L! V; c! Y4 w% A
power(yiDuanShuJu_LowMean, dv0);" p. v* o# i& y
& q* z ?5 O5 x/ Q1 k, X3 v1 | int_sum_dv0 = (int) sum(dv0);+ n& Y( A* d+ @( Q, p
' M! j4 q r0 J. Z
UARTPutc('B');; G5 s6 k- v( M/ N% F
UARTPutNum(int_sum_dv0);7 r. p& x% t, d3 @1 U% C
UARTPutc('\r');
0 o7 ]0 n" c4 R2 v4 }* ?$ z9 K UARTPutc('\n');
7 `) {8 y$ a9 \. \( ?: B) Z8 r( t0 j6 \) h0 E n
// int compareFlag = int_sum_dv0 > 1.0E+8;
9 S7 |& F, b: W8 E% v- a; t& @( @, @
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
2 X$ q8 _. b5 q* o8 Y UARTPutc('C');
+ X7 \/ W6 N* X8 l/ Y3 J6 h" ? A /* 比较信号能量 */) l( X5 L" B6 Q: {1 `' N! {( v* j
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */" n8 z6 Q" n4 v% m0 `
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
' T3 p" [1 T# l/ v. T9 ]" q// for (ixstart = 0; ixstart < 1000; ixstart++) {; W1 o/ ]3 }: X" y
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] = @8 X5 H- C' b) d' G, k
// yiDuanShuJu_LowMean[ixstart];
+ H9 z& S8 ^2 E: {8 V// }8 E3 f) t* o; p/ k/ }- M
//
+ F( |4 i) p% P7 i! |' J& _// youxiao_k++;# P5 b; l8 y) a
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
5 w+ g- ^% ^) `8 J& M6 P// /* 感觉要取21个数,即0-20, */
8 C- {. i1 w1 e" ]# b4 r+ j// enough_data = 10;//有效是10,无效是0
: k @5 y: K9 j6 \) f8 N: _// }/ m/ i, I: e1 A0 q' n
}
& X8 R1 I' j( ~
# f% V% f& |: F
- e% _+ K% L# M4 |* ^3 O enoughDataFlag = 100;9 C/ h$ m5 S6 |1 \$ ~
enoughDataFlag = 1000;: ]' k$ k: S- i
enoughDataFlag = 0x02;
8 j8 t8 B) \7 R& X enoughDataFlag = 200;
$ [3 J- S1 `6 W( x# Y+ y/ Y
/ \/ z0 }+ i& ^5 k" g& R. ~ int myfuvk1;5 Z& n2 r7 E/ {9 c1 x \6 U
myfuvk1 =11;3 x, x, B5 t( ]. k3 N4 H
2 q5 q7 I2 ^7 T# d3 n+ n
7 I& e. n" j3 o4 s
enough_data = 0;
/ S; _* X# Z* p% ^3 W7 h+ q
- z$ T8 h; P4 g2 E8 B7 d o) R& _// if(enough_data>50){
/ T5 d5 G( B7 V// enoughDataFlag=0x01;0 q% t1 s8 V' d6 O9 b5 u9 p
// }else if(enough_data<50){ o' J% l) U- L: R
// enoughDataFlag=0x00;//0x00还是不行
$ _+ C' Q; J2 D# C// }
}1 B" D; i" e) C
! o: p) k4 K, p: z- Z9 d3 y* c& q- X W! H& J- M T
oo=10;
/ [1 N; F7 T1 {( Y+ Z6 [2 t oo = oo < 5;
3 Z* X% ?* o- b if(oo){
0 ]- x5 s& O/ H- V/ v4 e# I" m ii=0;0 f- d( D$ q( ?0 A+ a. h, L
}
; M: @; R5 C# a/ k }/ ?6 h4 I if(oo < 5){
7 [; c, ] p( Z* A: [ ii=0;+ F! }5 ^" c1 T( J/ M7 H
}7 l0 _% A/ L, T/ ~2 L" Y/ ~ A
if(oo > 5){
. b o( l! g2 D. k' p1 l. p ii=0;
7 C. X+ K0 \- J' r7 L! n7 C }9 y$ j) g9 \" e/ ?
& b7 u& k( H- G: P
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
- `9 o6 \6 e: I4 Z) Q% a /* 如果数据足够才执行主程序 */' v$ T+ o0 o! G" G* y2 G$ Q# _
oo = oo < 5;+ C, D& l* P$ Z, C* C, {/ ?+ O4 g
enoughDataFlag = enoughDataFlag < 5;/ n" N9 \( a. h/ U5 {2 w3 X
if (enoughDataFlag < 5) {
8 a, l8 q. C1 n; s// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
- W2 A/ }% _( l! m% w/ v3 C AGC_AGC(&pAGC);5 ?: o2 e4 X! f* y
9 S0 _# f; @) h' j9 {2 r6 B$ R c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 f3 _, I2 X. y1 v ~$ Q2 ?# R
FIRDecimator_FIRDecimator(&pRxFilter);
* a0 C9 [4 j; Y# p% w, t# n' L& g' j$ V% ]# i
/* Downsampling */
. f( w4 v' i& A c_SymbolSynchronizer_SymbolSync(&pTimingRec);/ ^. b# h* m+ B& C' a4 K
2 C! @* ?' R! F& G2 F7 q c_PreambleDetector_PreambleDete(&pPrbDet);
- J: T5 u5 t7 h) }( W% f
, T6 |) T' d/ W/ N /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
}4 B' x9 J1 A; w /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
+ n+ x1 q* O! l+ I7 L /* %帧数量=100 */
* i7 E, K3 H+ |9 }+ w I! ]! N pFrameSync.isInitialized = 0;
, {- b/ a, u- _! m# G. m5 N) n6 _$ r
/* [EOF] */
* x/ L6 ^. m3 c) J# r /* 前导码长度是13 */
$ d/ Y$ t. s0 K! |4 U& l /* %qpsk */9 B9 p2 C5 j8 n* j( \! M$ m- E
pDataDecod.isInitialized = 0;
o2 r1 V+ `" ]0 N2 i, _: e6 G$ Q6 }
/* end */* j" b, d7 N6 k- n9 Z3 z$ X' S
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
/ P4 I0 q" }( X- ]+ T& ~7 C% h /* Convert 3-dB frequency */% V1 A* h# r8 r
/* Convert 3-dB frequency */7 T& J. x6 z) T2 Y4 v) B
filtfilt(save_buffer, usable_left_filtfilt);
: F( O$ C* p% M) G5 n1 M) w for (ixstart = 0; ixstart < 81000; ixstart++) {
0 t4 a. i( s {5 N8 ^/ s usable_left_filtfilt[ixstart] *= 2.0;# y0 H4 L ~5 D$ H. Q; c
}
! L( @7 u4 }, y1 E# }) E. D1 o/ T" r0 ]) l9 j; `
/* 注意乘2,处理幅度 */
7 n! k" v8 G# U% [! y /* %% 我发现带通之后其实就均值为0了,不用这一步了 */& h# t6 E' F% v- [( ~0 r; M
/* %% 行列转换 */
8 a& ?/ p9 s. p6 A0 B7 J+ q+ _1 [$ C yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
- @. Y, ]% }" h3 V$ N* Y+ h for (ixstart = 0; ixstart < 81000; ixstart++) {
& n9 O& A1 T% } youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]3 r- K9 x; K; e" @
- yiDuanShuJu_mean;
4 g* E0 ?! @2 {) i4 r' Z }$ X C! k* l1 _4 o9 a/ i. s
" ?; N0 k! s, A( R+ e0 }# y
/* %% 应该对数据归一化,但是这一步放在哪比较好 */1 }2 P# O, W- c- N( v
ixstart = 1;
" K7 u3 z( w/ Y7 b mtmp = youXiaoShuJu_QuZhiLiu[0];
+ w k( b% u v; K' Z- a+ u if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
% h$ [: w {# n9 J& w, o$ m, T0 D+ Z ix = 2;% w- e& _" J i9 p
exitg2 = false;
9 E3 w) z5 u5 ~- n while ((!exitg2) && (ix < 81001)) {
. G% f5 k9 z- h4 d3 P ixstart = ix;! U5 i$ s5 i' O1 _- ~
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 b. d" \8 I3 H X" s9 M
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
& ~' O9 p' Q* f" }$ t exitg2 = true;
; e3 b; T+ A* H) C: @+ a9 V } else {
$ W7 N1 c# O1 d y( C ix++;2 b4 L% {5 H/ z/ @* F# a- i6 C7 ?6 e! g
}$ @9 ^( a! _6 D: E I
}
+ w6 L$ @; N* S6 Z }
$ b" w% A: G6 L4 l3 @9 F9 J6 C+ |: @# m6 i- f2 H8 N8 c% e
if (ixstart < 81000) {
; K$ F3 k2 D8 m1 V0 R) I: _ while (ixstart + 1 < 81001) {) r: N% p9 B* g& N5 |9 P) r1 \
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 m# c/ h3 I: y2 u. c: V( Y mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ ]9 t0 \. n. s! m/ W, X }
$ D |1 z! o3 r( h7 L5 o3 e: E1 O) J2 i. ^3 f
ixstart++;
% _2 M1 n' N% J% g. h4 {" m) D }
* N3 s& K/ Y2 n1 m) l( _ }
7 i& c& B N8 _( u4 n9 b7 t! A f4 V) ]* B
ixstart = 1;
3 ^5 K; J6 u$ i/ q yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];6 e5 q j# a# u' z
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) ^7 u- F! N5 P. L1 H! u- O9 ? ix = 2;% T7 `1 m6 g1 p: {
exitg1 = false;9 Q2 k% J$ _! T# Z* p7 T
while ((!exitg1) && (ix < 81001)) {( S+ u7 \5 {& N/ A
ixstart = ix;
( J2 g) M9 _* X* M4 p8 W6 O if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, F8 N$ S% {, f% |1 E5 }+ e yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];8 B. d/ C! N n7 m8 F! p. K) g
exitg1 = true;
Q; ]8 ^4 f: F2 y+ r } else {
/ J; M% S) U$ M; }9 p% L ix++;
7 d9 L O9 a5 Z4 B3 I: a* z }
# g" j4 [4 x& [8 I# p% m }
, ^2 W6 s9 |8 E. S, Q* v" W }
6 ~ [/ Z: v. S* C% `) k5 ]2 V: n
, G( Y$ R1 X3 z. l: ^9 M/ _ O if (ixstart < 81000) {
' i. n7 U: ~$ y& D- K! H3 @+ o while (ixstart + 1 < 81001) {+ N" W- q! O+ k6 M1 o; @ \ _0 s
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {9 }$ H H* x- p" A; j' `# p
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
6 ~4 M) Q% a. q- R) y1 i- O$ Q& |# ^ } P8 e1 U1 ~9 F) \. T3 M! o: a
_8 o8 ?) M8 A' u+ C6 D ixstart++;7 b6 r' E# u Z, Y
}
# d. o! I/ N6 n5 K }; o$ F- w$ h! W& ?/ h P: m% s3 @0 u
* i& `/ E: u/ O* R yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
) t, A( p% L* h' ? if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
" l9 z' B5 B6 H yiDuanShuJu_mean = mtmp;$ P9 ~6 f6 `, \
}) J6 g- [ H8 }- P
' E }& @$ u7 m /* 找出极值 */* B4 D L3 @; { g' M& ?! a' m
for (ixstart = 0; ixstart < 81000; ixstart++) {4 @7 u6 g4 q7 \% ]# K+ j
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
1 Z9 t! w0 `) l, ^2 W* g, Y* O }
- X" a6 L \# @: C! t7 F# I S" K4 I. a- W
--------------帖子字数限制------------------! z; z: O: e: z, l# b
}( n4 s: q# i" H. ~/ K
' U1 w( K8 v2 `* f
0 E# T% l) W+ W
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|