|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 + `! }& ?- H g" q
6 @+ g' Z* |1 l+ r0 [( K
各位大神:
* f5 x9 r# _: P' Z: ]; Z) u% @ 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
! @5 v$ d; m* L0 k v 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! [) b( Z2 T- a
- L6 D$ d6 [1 g/ U9 v" O
) i, q3 Q7 B7 G& h2 {% X* N+ f; U这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。" i" G8 @! E2 Z s
$ \. I( L7 D( o& r3 m" Y9 W
并没有其他线程) I5 p# z, y3 n
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。( }9 l: }. p/ Q% E( N
也说不定是和堆栈有关系。。。。。。
- G4 B: J2 _: W: X* k- X& v* L请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....; R6 ?1 Z" Y9 [
9 K0 f1 ]8 R& i& E+ _; q0 e+ N: X& n, k8 b% I- @: t
1 u. r$ P4 a j7 u4 t3 K' X' R我也很绝望啊,希望大神能帮帮忙,感激不尽,!
+ K% m4 y) z4 d* I' A
9 E, G1 P! ]- p1 K! K" T( s7 {! l2 r6 o5 |
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
x4 N' R5 k0 ]( j static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
. x+ P7 V+ [) m- ^: r: g- h' b, b$ c
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(* t$ D* i) e( B |4 u& V1 q
const double data1000[1000]) {
5 b6 Q/ K! j6 v! L7 G
' y+ }6 a2 x9 N5 V1 m! Q int myfuck;% D y& q* F+ s' ~3 o. H
double yiDuanShuJu_mean;
' x, K9 e, J* ]& L: R6 |/ _ double yiDuanShuJu_LowMean[1000];
- `; W% S4 O4 s9 c- g int ixstart;
! Y' L, a# U0 g \0 H" q# @/ N double dv0[1000];" k6 n/ S8 C$ f% `
comm_AGC pAGC;
$ K3 k; w( i" v* Y' D- f$ b, K comm_CarrierSynchronizer pFineFreqCompensator;
/ S( Q: ^! |& e* ?* o% t4 n- l dspcodegen_FIRDecimator pRxFilter;; Z# _ @1 w& Q: L& E6 _3 `
comm_SymbolSynchronizer pTimingRec;$ X2 R+ f6 q1 `2 E$ S8 z" F9 X
comm_PreambleDetector pPrbDet;
8 p7 P$ @: P( [' Q8 B& _2 A0 k FrameSynchronizer pFrameSync;( D# |+ w m2 x6 C' K
QPSKDataDecoder pDataDecod;
! l# k- U7 Z5 F! Y; t3 c2 E static double usable_left_filtfilt[81000];
K3 T5 v4 y2 k5 o' Y% k8 ?8 ^+ ~2 w static double youXiaoShuJu_QuZhiLiu[81000];
1 {! v4 i4 f G" L( g7 }3 j' a" M double mtmp;
2 Q# |" k& V5 Z int ix;+ o2 X: A- w% ?( F
boolean_T exitg2;) u% O" d J: v* |2 q. @
boolean_T exitg1;
! H: N% {6 i! `* v9 M double YiZhenShuJu[800];
# J( ~# ]3 n$ E double dv1[800];
+ ^% U) \8 ?/ Q0 k3 \* k" P0 T2 e" h- `; Q) S# C. N1 d; l
6 L ~: U1 i. L) l% g/ [ double b_YiZhenShuJu[800];
% \5 ? k) F2 n! A double I_filtfilt[800];
( ]4 w7 t& o* [! N7 _7 S double Q_filtfilt[800];
1 N/ v$ U; n+ {; w creal_T b_I_filtfilt[800];" t8 @/ m7 n3 j( C7 I; k9 J2 |% q
creal_T b[800];
, x8 D% e# c/ Z X. \5 c! l creal_T RCRxSignal[50];
: O0 L4 D$ h# n3 q2 v creal_T fineCompSignal[50];
1 ]# Z7 @2 D' S. R- g# Z4 P/ O/ F0 P double phError[50];6 j" P$ t8 n. R! ]
creal_T timingRecSignal_data[28];
" e( l w$ q2 g( o6 y! I7 d+ O1 l int timingRecSignal_size[1];
* |" d7 x: V; N0 N double prbIdx_data[28];
8 Z( f) ^! T$ x# a int prbIdx_size[1];
: C: D/ _1 m0 y; v& c& d9 T double dtMt_data[28];
M; ?. `5 H H9 e int dtMt_size[1];2 I! G& W; J2 i5 B5 t
creal_T symFrame[25];0 T) F5 |! j: q& p) u3 u, e" w, f
boolean_T isFrameValid;6 t; C; L! A9 ^: E( A A! z
double unusedU0[3];, R0 k4 J$ K- |& @
. w0 K6 [- F+ U6 w+ h3 E) r8 }
//调试过程中的变量
b% U o! {) k* }8 \3 D2 _! H int enough_data;5 Y3 }# I) G& t) M3 s
! K3 q) U) Q% O, }
int enoughDataFlag;9 X, V0 K3 C% k$ I n
int yiDuanShuJu_mean_int;
0 _3 c: s* D% v3 u/ f9 \6 F8 [. i int int_sum_dv0;
* n! ]8 {- Z1 I* G$ D int oo;
( { C7 b: ~) H" z3 B6 G int ii;' S0 t6 \. G; Z3 [* B
myfuck=10;
1 @; C: q8 _4 ` /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
' N0 D) i) G9 _8 v6 Q* Y6 B, H' r /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
( w6 f' y* J* s! t+ [8 A
2 x# w; [; o: v, f$ O yiDuanShuJu_mean = mean(data1000);3 G" A+ Q" y; L
! Q2 D3 L7 c, o6 K: C. Z" Z1 p* p yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;6 J. A, W) @1 y: i3 J
UARTPutc('A');
/ O4 T6 _; U( k3 W$ f UARTPutNum(yiDuanShuJu_mean_int);7 m! T, ~8 E0 C2 S8 e0 S
UARTPutc('\r');
7 Y9 Q+ C6 S b; w. r6 R UARTPutc('\n');% \! X7 |; d# K
) b0 O- j. p& V3 R9 L# L; Y
for (ixstart = 0; ixstart < 1000; ixstart++) {/ @# Y+ G2 M: I* t0 k1 n) @8 B3 C
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
2 v$ O( S1 F3 t0 U+ v6 h1 L }# B6 z7 M/ u! j8 e g! \( k
% N. z* r) K8 k1 \' ^
power(yiDuanShuJu_LowMean, dv0);
8 a3 v% p) y. r3 y1 m
4 U7 J0 q# t" V3 \: K- j; ?' g6 c int_sum_dv0 = (int) sum(dv0);
% E* T. @% z; O9 |" Y1 B& U6 L- u8 Y3 W6 ?5 ~1 R
UARTPutc('B');- d7 v% K" W+ e3 }
UARTPutNum(int_sum_dv0); R6 z: s% z4 n9 Q* l
UARTPutc('\r');8 S4 n- z! \0 W
UARTPutc('\n');
9 q" r! r- ^/ @7 Y0 X
/ k% K6 e( Y' ?3 m" Z5 H// int compareFlag = int_sum_dv0 > 1.0E+8;
4 `0 X5 y4 H1 K$ s8 P3 ^5 T/ M! @! h2 ~1 a3 p! v7 E! K8 |5 R
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
% X+ N7 ?. `7 R _: ^4 ~$ c7 O3 Y8 ` UARTPutc('C');! ?$ F2 f* H4 s+ B- A+ \
/* 比较信号能量 */, j' b- w) U9 v
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
4 p5 K' b! D8 A$ b// yiDuanShuJu_mean = 1000.0 * youxiao_k;
9 n( r- x. P& j- Q2 ~// for (ixstart = 0; ixstart < 1000; ixstart++) {2 K7 A @! B# x. h
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =( Y# S! S7 u$ E: T4 G; X0 R, X% J- ]
// yiDuanShuJu_LowMean[ixstart];0 {. a7 B2 A0 ~ C. e- R
// }
% k& r: |6 ~, H& y) y# M# ]: A//
2 F0 @. b' [6 I% j2 I6 ~// youxiao_k++;
8 y2 h( Z: W H; D9 e// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==: ~' ?3 A3 h. }8 y' m% E: \1 T& X
// /* 感觉要取21个数,即0-20, */
@/ a" f) D8 s& Y1 y& D% C// enough_data = 10;//有效是10,无效是0/ j. q% l5 a/ g8 @8 v; J
// }( h# }, d# X: d+ m5 T
}
+ z1 N" a, S, G. i w& y2 d7 D
, g- K* D5 z- h R6 ]) S
3 J: d9 f. {" v: e- X1 U enoughDataFlag = 100;" B$ A0 q6 |: @, l! ~. h6 p4 T; v
enoughDataFlag = 1000;
8 t; G; f( v9 {0 f: X/ a8 T' l7 M enoughDataFlag = 0x02;
, z, C- Z# \0 j2 V5 F. l5 @, T enoughDataFlag = 200;. X0 r: o( w( _8 p% Q
( |& N- {$ x% W* q7 d) o int myfuvk1;
+ U5 @' V" _5 w6 O" n$ `# Y myfuvk1 =11;, M$ O! D0 l% V0 d9 M8 b
4 J8 l& {( Q: r; C8 P, Z' ]9 Q( j. |* O6 L& U |
enough_data = 0;8 _ U) D8 E2 J& }% \7 R" Y% O
- S8 \5 J5 i4 J* l, ~
// if(enough_data>50){
- W9 q2 z4 D- M// enoughDataFlag=0x01;
6 D6 e# w" x. Q2 P// }else if(enough_data<50){
: g. s6 u8 F5 W& ?( h |, Z0 [4 |// enoughDataFlag=0x00;//0x00还是不行
# G1 g: z: r: P- z0 j% g( _// }& k# y' G4 P9 m, Z; y
9 I* C. X R! o, V
5 F. o5 \! A! g1 d% [" C+ l oo=10;
* J) s* o5 E' {; R) G6 v' C oo = oo < 5;
* A+ N/ m$ }6 h' `8 @$ ]: a6 q if(oo){
" ^% L* G2 w* K% }0 a+ b4 m ii=0;
1 t F5 G1 ?" @- i6 ? }- X( y( G7 B) R/ w( ?$ I
if(oo < 5){
: o7 C' d: O1 {% A! U ii=0;
$ |4 j, l6 c0 S* m7 I }
1 ^ p7 F! e9 _ if(oo > 5){
H5 _7 _+ z N- R1 g5 V ii=0;0 J0 M" {# X. N8 T" q, r
}
1 r; m8 f0 {$ j, D# u
( I* {. x6 H4 z" ~ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
* u( \( e5 _0 s+ l /* 如果数据足够才执行主程序 */
0 J+ |2 g8 s [% M) s oo = oo < 5;) {: O5 Z; z; u5 |
enoughDataFlag = enoughDataFlag < 5;+ i! p. y F5 O& `" b. P! w$ z
if (enoughDataFlag < 5) {3 }+ t6 ^! w: F
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0 U/ w6 G, f/ [& Y, Z- c# O
AGC_AGC(&pAGC);; D5 T" m& L2 L0 D
+ g. Y* h& [0 x- @
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
- r I3 b+ Z$ H" P, C% h FIRDecimator_FIRDecimator(&pRxFilter);
0 a( p9 a: }. E" S; Z% O( a/ G' Q
/* Downsampling *// G& N* r3 B! C& f- G- ]& I) P
c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 Z5 C& @- v, x9 \. y/ a4 H
3 W' i* h/ s8 _, a3 }
c_PreambleDetector_PreambleDete(&pPrbDet);
' `, {* Z& [, Q W. ~0 s& X8 u: |, z0 S/ [) ]* x
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */. `4 R& q2 S3 D, r' f
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
+ E, E! [0 j# S: g8 w' h ^$ ] /* %帧数量=100 */
# E0 U4 F+ m0 s$ z2 u9 C' `. ? pFrameSync.isInitialized = 0;% D. S% K2 v4 o9 `. U; X
; H5 P+ T6 `# x; c2 d7 R" ~% W /* [EOF] */9 p C! U1 x# D' U# S
/* 前导码长度是13 */9 Y, C# k& \4 |( \: S c
/* %qpsk */4 z8 O) ` _: G& O% y+ m4 _
pDataDecod.isInitialized = 0; I. N! O0 j$ L) U. J
- M! g2 u, E) H2 U3 b /* end */
" h4 L# l! G: w( T /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
1 z# r: e9 x# ?8 K+ I+ H: }& i% V /* Convert 3-dB frequency */9 |. P/ c, }1 K) J' Q3 ` R2 b
/* Convert 3-dB frequency */5 E5 P1 r6 R" b A9 C+ ^3 P
filtfilt(save_buffer, usable_left_filtfilt);0 C2 X: k f% U8 r( v! @; g4 t& {
for (ixstart = 0; ixstart < 81000; ixstart++) {
/ }0 w8 [1 A+ p$ W$ d a, q usable_left_filtfilt[ixstart] *= 2.0;3 W5 o5 Y1 R7 q4 o o3 t& e
}0 M y1 d( E$ k m$ Y& y4 k4 T3 i
7 G" `0 q7 @% e3 F- m$ t /* 注意乘2,处理幅度 */
$ \8 B$ K8 l2 r; K8 m /* %% 我发现带通之后其实就均值为0了,不用这一步了 *// A, Y& y6 {. W0 ^9 Y; N
/* %% 行列转换 */
- e6 Z. a$ \$ i3 i: x+ y/ D2 u1 Q yiDuanShuJu_mean = b_mean(usable_left_filtfilt);5 C7 p! `8 P; k2 {9 C
for (ixstart = 0; ixstart < 81000; ixstart++) {
& B/ s- ^; b5 \9 s youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]4 D# A5 W) _- c5 |# Y& q
- yiDuanShuJu_mean;5 ]3 T2 o2 ~9 w- Y# p" {; P
}
+ k9 f% p! ]7 ^ u- u" ?& c8 ?; \ k+ H0 n' F
/* %% 应该对数据归一化,但是这一步放在哪比较好 */& d' `0 k5 H- y4 T5 ]8 m3 D
ixstart = 1;
% t3 L6 M( K5 l, y1 P mtmp = youXiaoShuJu_QuZhiLiu[0];6 ]4 h4 M2 {& J
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 N2 s# {/ Y8 t6 t( c, c ix = 2;2 D! \* z! Q1 V/ o. k! D
exitg2 = false;7 @/ B1 Y9 k( n3 J
while ((!exitg2) && (ix < 81001)) {. j2 {. Q2 v% a
ixstart = ix; ` F( L1 b0 b8 b: o
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) { L4 i0 V9 M! d9 ^
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
2 K% D* \% Q9 i$ o exitg2 = true;
4 s. Z9 S- Q3 Y$ N. x1 D } else {0 B$ J6 r, D- t& Q) M% b
ix++;
2 f- E9 H: c) F/ m2 V }: _# q* i& v6 {
}
3 }7 x# ?% \% M( p% e }
! F" Z4 B1 ^' q o' K* F9 Y8 N4 J! M! [0 V) s
if (ixstart < 81000) {$ s9 a0 y% O4 m) F
while (ixstart + 1 < 81001) {
. X0 g) }, w+ |- q: y if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {- V$ W$ r+ |5 a2 y6 U) o
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];7 Q9 }& Q5 I3 f
}" F2 [2 A5 v& V" p2 V6 {2 a; _8 M# q
+ K5 N2 t0 _7 v, O1 S2 D" G* ^ ixstart++;
/ P7 q$ }4 j4 y& H f }& `; M: e9 ?, T* I
}9 T0 g* O( k0 {% }
6 B" E- F3 V4 y. C; s& D0 d ixstart = 1;
2 ]5 u& }% O) |' R# f3 u yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];3 ?* N- g! i/ ^9 }7 C' w- D
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {9 y7 j. L7 j, n; _2 \
ix = 2;; Y. g' ~) q: c
exitg1 = false;9 v+ ~+ q4 _5 w8 x2 y! \" J5 T4 w
while ((!exitg1) && (ix < 81001)) {
( Q6 {3 W' E" G/ j" F ixstart = ix;
9 b, U0 K0 Y" J1 Q5 a if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {9 p% q" _* F- v' Z7 Z& d
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
- p: w0 P' ^) Q exitg1 = true;
+ T7 S7 @/ _, Z4 r8 _9 j2 r* G } else {9 U" y- A( c) T% R o6 v
ix++;" B" X4 B1 \+ o0 @# [: @
}0 k- X8 o5 R' n ~) |9 e
}
, A# k' M/ B5 c0 P }
& Q) I, P/ h9 V, O& g2 c- h! P# G; C- q* @( e
if (ixstart < 81000) {
4 ?. f$ s" c5 o. n' M" h9 F while (ixstart + 1 < 81001) {0 n; g$ d- l2 d2 i
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
8 t; x" N* t. m. h yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% v' k" k% r! m7 }
}
3 R) `4 b4 {. N. q% x+ M, j/ F( K; ?, b M2 Q. p
ixstart++;8 H: j% W: V3 n, ^
}
# m0 `- B6 E0 @ }3 O }
6 \- k* d& E" E9 H( _1 A; x& |3 W3 r% f2 v- I5 d
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);8 T. y; x4 m! S" } |) b' g' X
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {7 Z+ Z9 A4 x! H) }
yiDuanShuJu_mean = mtmp;- d$ }+ i) \( r4 L8 ]2 Z$ W
}
I- K* e+ m& T$ `9 L# y9 f
' |( F8 y5 z3 k2 `) e$ U2 a /* 找出极值 */
& u1 x4 p% c# N; @ for (ixstart = 0; ixstart < 81000; ixstart++) {' X+ o' D5 [! a/ n
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;1 h7 a7 r* K! `
}
% |9 p$ h& B! L3 D( V$ ?- }% W8 t" Q7 K" E& U* X# O' Y
--------------帖子字数限制------------------% a6 ^; ]# H0 w1 G$ t2 L# Y/ V
}6 o2 @6 [# m* J/ l8 G4 ]
" |! |, G+ r, v- W3 y: U2 h$ @: \1 u$ @! t6 F6 m
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|