|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 - h& o- F1 ?" O* E4 e9 V% I9 o' d# B
0 P- j2 H! I- p: D: ~% L
各位大神:+ w9 `0 _/ H4 K# f' l6 O
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)1 L0 }' d7 D& [+ U, I
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:7 H: }/ c G2 }; {
7 r9 b8 L0 C3 N: J! x+ K. r
) S7 U8 A! A6 p _& _1 u0 ?
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
! ~7 B" z2 E# r3 l, t& L& q; v9 j. @$ W6 T
并没有其他线程5 c$ u$ |8 w/ Z5 Z" A2 \4 X G: d8 F
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% }: @4 ~- B. p7 @
也说不定是和堆栈有关系。。。。。。
5 {3 e& k0 ]; K6 U请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 H9 |2 k! [9 s( k' i8 r: _; W; I3 D: {) v* X7 l, w1 h& a3 A
! c$ N0 J+ O1 b# L( d; B8 _. O
' k0 K8 p$ M) p5 E, {我也很绝望啊,希望大神能帮帮忙,感激不尽,!( A) ^* L; _' K4 b1 I2 A
& N) l5 ] W5 X& Z8 E
1 x4 t: L" d4 q4 R2 e/ j8 g- Y附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];3 \' b3 T5 n/ j8 o
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
# M- D' M. S; `5 {, I) Y3 F Z, l+ ?( g% J; p
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(; h5 u9 g+ u. }
const double data1000[1000]) {9 N- J) U" w% r6 Q" e3 e8 y9 R
5 ~. G, Y- u7 R2 g8 L int myfuck;! C' U& W( A) @* K& q5 U5 D# T( |
double yiDuanShuJu_mean;% p6 F8 m' j* @/ W( r
double yiDuanShuJu_LowMean[1000];4 L3 v9 Q7 u7 O1 V) s
int ixstart;
1 T4 s x% x: @! i% [% k2 F' Z double dv0[1000];
; U4 d6 S: o# N comm_AGC pAGC;
; x Y5 @) g" k+ ~0 r9 V) l comm_CarrierSynchronizer pFineFreqCompensator;
8 F! e, B/ P0 s$ o' v& ?2 C, T dspcodegen_FIRDecimator pRxFilter;
4 T0 N4 }6 S+ c comm_SymbolSynchronizer pTimingRec;
: ?* G% t" x7 t8 Y7 b& D* P; i comm_PreambleDetector pPrbDet;; i/ a4 w; X% _' Y6 P3 N
FrameSynchronizer pFrameSync;; P1 o! q2 a T T
QPSKDataDecoder pDataDecod;2 }! q2 T- D/ ^5 {
static double usable_left_filtfilt[81000];
6 x5 n8 m# Q) y: O0 z- D static double youXiaoShuJu_QuZhiLiu[81000];
9 m, p. Q0 k) Z double mtmp;- {8 {6 E" v0 ]) _1 z2 j; R! G
int ix;
+ h+ {3 W6 H9 Z boolean_T exitg2;
" }: D* O! t) Y1 ~7 l boolean_T exitg1;
4 r* C1 h' L, Y) f& W) i+ T double YiZhenShuJu[800];
7 P% V0 Y- ]$ g; \5 M% f double dv1[800];
9 e% n' D% f# R9 z1 o
3 |0 y6 F. V$ R. H) f# j4 `% R7 N% G; L0 r4 O
double b_YiZhenShuJu[800];
* [/ Y t. D8 |) J+ Q. s double I_filtfilt[800];
$ a3 s: a, x( r, m, [+ p; ^ double Q_filtfilt[800];4 j6 Q% u5 s3 v8 s
creal_T b_I_filtfilt[800];: u; \# | M( [% N
creal_T b[800];7 A' X% l' ?/ ]* b" _
creal_T RCRxSignal[50];
/ Q" M% O$ z8 Z7 U1 K0 @: n i creal_T fineCompSignal[50];
9 b! K, g o/ N double phError[50];
5 I4 m" x9 b8 |' s6 \ creal_T timingRecSignal_data[28];
( t; u; N, m% w$ ` int timingRecSignal_size[1];
' _' R( w% d' U) l9 c" j( o double prbIdx_data[28];
. Y$ r N! t: l# X# O) ^/ D h3 k1 C int prbIdx_size[1];
6 T4 L- z1 W+ S9 v) v7 Y" y# ~9 n0 z double dtMt_data[28];
5 m3 b5 C$ `% U: w, d int dtMt_size[1];
' O$ J; R/ N& q& {2 j6 [, ~ creal_T symFrame[25];
6 w2 {9 B8 K- H boolean_T isFrameValid;
* u. l" R: z2 F5 I- n/ g5 P6 y double unusedU0[3];
' R) `: w) d. ~ O4 Y6 ^) P: }( ?1 ~8 N: ~, J8 W6 x
//调试过程中的变量
( s* e: l2 ~% v1 p% y7 f, p int enough_data;
9 o% d- P9 }' s6 e: C4 V- | K& G/ [# e8 g; M
int enoughDataFlag;$ N4 A1 {" {2 k0 y7 T) E
int yiDuanShuJu_mean_int;
/ d( D* _5 K4 ?* x; U* ?4 q int int_sum_dv0;
9 h8 Z) a9 G' U int oo;
4 {6 i+ P5 A0 @2 { int ii;
* }# r5 U: {$ H! U# f0 p* c myfuck=10;: v/ A+ }3 b! a2 s. m
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
2 k4 D% r; l7 N6 B: ^: X /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* [9 p/ r% a5 q- @
( S. b7 a; I) u {# s! Z yiDuanShuJu_mean = mean(data1000);
1 m: x4 S: L- ~ ~* e
5 `* Q4 F" e u+ U yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;7 }( |- }& H; p, O4 ?1 U4 {) U
UARTPutc('A');8 L0 _& E4 T9 g: A% `3 f
UARTPutNum(yiDuanShuJu_mean_int);, D# Z. [9 q6 f- p% |' `9 h
UARTPutc('\r');
& X |/ v' `" ~! w3 f( ^) s: S9 H4 c UARTPutc('\n');
# Y m/ V. F& Z/ `$ Y+ \! U
6 u7 m; d0 J$ ^) m f+ l for (ixstart = 0; ixstart < 1000; ixstart++) {
7 [- D' P. v8 ^1 a yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
o5 z6 a) E9 V4 E }4 _ C; U$ K A5 z6 g
- Z$ ]" o# }9 y8 H power(yiDuanShuJu_LowMean, dv0);8 k% d# `; f; g
" s* ^. X- b) J: n1 {9 `$ n
int_sum_dv0 = (int) sum(dv0);
; O9 {: @9 {, d) X2 o2 k
& u! z' ]5 Q, ^) `; V8 m UARTPutc('B');
' [5 y* l, D. I A% J$ B UARTPutNum(int_sum_dv0);- E$ Y; ~! E- D" y: I3 d; `
UARTPutc('\r');
. A7 i9 V% k4 B8 i( Q% f7 ^$ r+ x UARTPutc('\n');$ k! z- ]9 |5 @4 _4 e( v
/ M' ^; Y9 T; K+ G
// int compareFlag = int_sum_dv0 > 1.0E+8;
' O$ n8 y5 b0 c+ L( m L$ W* U' T
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?3 j2 {2 D) v6 N' j
UARTPutc('C');
N& _( x0 G+ J7 F T /* 比较信号能量 */ i" y6 b0 t# i4 U9 _
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
1 d3 @( s% W& o; Y1 D; X* P// yiDuanShuJu_mean = 1000.0 * youxiao_k;2 t. M; v9 b6 \! f v/ g
// for (ixstart = 0; ixstart < 1000; ixstart++) {' Q8 N7 h' J& C. h6 r9 W
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =9 }1 a0 X) u9 m, j
// yiDuanShuJu_LowMean[ixstart];
9 x. L% Z8 G2 O9 r( G3 ^4 }// }2 Z6 A2 D- S' V$ \' m" P1 g
//
/ U( U! r7 d- v& }* x! ]1 ?+ E5 W, U// youxiao_k++;& g X" N% o& Q- S- I8 d4 }
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 `7 M4 y3 i J+ H0 K
// /* 感觉要取21个数,即0-20, */
/ D4 ?* N( w5 _7 K. D& C7 L// enough_data = 10;//有效是10,无效是0* x9 @5 G, A9 e- l) E
// }
/ v# O1 D$ [5 g( \ }
9 F8 J9 |# H# v
3 [- n: F. c q1 v$ |% c r. g B' @) [* e
enoughDataFlag = 100;0 }8 Q. s. j: X. A
enoughDataFlag = 1000;
! M% L/ ~' v! n: Q1 m enoughDataFlag = 0x02;
( |( g6 v3 e+ r$ B) m: H8 x enoughDataFlag = 200;2 |/ T2 P S' X" D) f- V6 G
7 J$ ~$ e8 l2 L4 K" }
int myfuvk1;3 p& g* c* s0 g
myfuvk1 =11;
7 s* P% M4 A+ G5 u$ p w7 H! r) k0 P6 I
8 H/ ^8 s4 I( _0 F enough_data = 0;
4 i' E! ^* ~0 Y6 C9 B) U3 Q) ?2 L; P. ] ]3 s! k
// if(enough_data>50){
5 I* y2 q' Q5 a) Z// enoughDataFlag=0x01;
3 M5 v! v4 Q: |. S// }else if(enough_data<50){
# P6 ^9 Q6 H4 O- b4 Y1 x5 k' y% Q1 R! N// enoughDataFlag=0x00;//0x00还是不行
C5 s- @2 e/ `0 x; r P// }7 C; ~) k- u& [6 e" Q; \
; s$ k* x; W4 u, L" D4 F+ K; j& X; H& r- h1 x! b7 q/ b( h
oo=10;
8 V" O$ Q2 d" P" g2 r0 ~ oo = oo < 5;
( F Z8 F" o" C ?. @ if(oo){ G4 E2 V: o2 K
ii=0;
" c1 o) G' m- D$ q Y0 b% [ }
1 L6 N& S/ ^1 r4 R# z# O if(oo < 5){
7 P1 W* ^7 Y8 s! V) ~: s9 B( [1 N ii=0;
) e6 p9 w# Y( ~2 @' o* k K; c* K }
6 ~% f( X. s- _! S9 L7 } if(oo > 5){
& _, R" |2 ]1 Q- j# \ ii=0;
# |. L) i4 y6 G) o }# |# |. N3 [# }+ f. o
+ {1 G y$ v H6 n G" { /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */; O% J. z9 m. K7 _8 Q
/* 如果数据足够才执行主程序 */0 N( [8 {+ h4 p- L) S) |$ `& j/ x
oo = oo < 5;
+ U7 b$ X+ R0 b! j4 s enoughDataFlag = enoughDataFlag < 5;3 P. p: q& {8 q
if (enoughDataFlag < 5) {* H* |" _& e f. [
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
1 E- `! ^3 [$ y/ z AGC_AGC(&pAGC);/ W6 n, E! V# ^
% ?1 i3 H3 d x/ R# e3 D c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 x w6 b3 V6 n* N" Q
FIRDecimator_FIRDecimator(&pRxFilter);8 S3 M9 _; B5 v1 ]
' ^7 _- u6 W3 t2 c% g7 u( A: T# I
/* Downsampling */
o3 b5 X3 W5 v6 L2 {3 Z! p7 d$ b c_SymbolSynchronizer_SymbolSync(&pTimingRec);, t, o! O3 Y) h4 u. }" E# j
6 y' N' S6 e$ `$ X c_PreambleDetector_PreambleDete(&pPrbDet);" e9 n/ [ M/ N1 p
1 r/ M/ @1 V2 a/ U* T4 C3 U: l
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */% X& n$ `( O9 h/ j) e2 x; S& F
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */& x8 @) I% A; l) X+ |$ R+ }; ~# M
/* %帧数量=100 */& s x% O; a) H
pFrameSync.isInitialized = 0;
0 A8 U$ G0 x7 T$ C! ]: w* k* H3 u4 a* p4 h) i# R, z
/* [EOF] */! e4 j7 [$ [- |5 D& B6 @
/* 前导码长度是13 */; {! {3 l S0 s- D2 u
/* %qpsk */
! y4 i s# ?; g! l$ j. H, b pDataDecod.isInitialized = 0;
9 l/ w- ]/ S! G& X. @: g6 i) n1 R, G: F4 V1 @1 S0 @
/* end */! Q W6 v' p' y! u+ w1 m. N
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */( \2 d, ?9 ` |/ S
/* Convert 3-dB frequency */2 n) ~ g; @" J0 [; T. c0 ^7 M$ f/ k
/* Convert 3-dB frequency */
' } n5 ]& a, O* q filtfilt(save_buffer, usable_left_filtfilt);/ z' b/ h- q; s/ e1 [
for (ixstart = 0; ixstart < 81000; ixstart++) {9 s! F1 p1 G6 }$ \6 w) o
usable_left_filtfilt[ixstart] *= 2.0;
/ z+ d+ u. v1 x+ C, I }' Z5 Z. {; V7 [3 {2 N' c. O7 h
' Q$ r( z6 P8 V$ Y, I5 `% i; o /* 注意乘2,处理幅度 */( j; U6 S. M) ~# l0 m* `+ c! r' d
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */* U+ X c5 L+ z: A/ H* [; Y! s: j
/* %% 行列转换 */
4 M+ b8 w7 G3 r6 x/ } yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( I- @0 z: `' v. E for (ixstart = 0; ixstart < 81000; ixstart++) {% ^( G# k2 A8 ] U
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
0 W* d( d( m( T( [' E - yiDuanShuJu_mean;2 x# ]7 e; q) L" Z7 z- V5 U
}2 A/ U+ y/ V, W2 x3 h/ \$ d+ r
5 Y; S- E! ^8 C# B+ q /* %% 应该对数据归一化,但是这一步放在哪比较好 */
; y1 Z7 w+ Y2 O: _# ?" z2 N8 C$ ^ ixstart = 1;8 Y4 W2 b3 e7 h. |
mtmp = youXiaoShuJu_QuZhiLiu[0];
6 R. \) p3 n+ ]9 D! Q/ b& ? if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
: q( o6 G! [: d2 t3 U% n' t8 m% V ix = 2;2 p' F8 g3 X3 h- k! p& N
exitg2 = false;
& w* k- `+ t3 i6 _4 U: v3 r while ((!exitg2) && (ix < 81001)) {
4 e* |2 f4 e" D( E5 [+ \ ixstart = ix;1 P* a0 e9 ]5 C: w$ L# H3 r5 k6 O" `5 ?
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
+ X U7 s8 C8 n- K) ? mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
! z' D. I$ s& ^$ D) ]5 z* i9 S exitg2 = true;# p" N2 L/ X0 u
} else {
) K3 l, g1 k k% t- G- s# {3 }, Z* e ix++;8 f% I2 _1 p& \0 Q
}9 l0 p$ s+ l0 ^4 J
}
$ M8 B3 R8 ~+ e9 J+ i R }/ n2 P) z$ a; f
( s* y) p/ X7 w& r, E
if (ixstart < 81000) {! f# p% Z( b2 v* H. _) C; w
while (ixstart + 1 < 81001) {
% {$ M) h: G1 g. y! V0 { A/ d if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 q: E9 r1 K7 I0 h9 I" C# J3 k mtmp = youXiaoShuJu_QuZhiLiu[ixstart];3 l3 p6 }3 o- i: _2 M
}
3 h, i/ J7 q; ?# f6 N( Q k! |# X, h2 ^1 @ V
ixstart++;& e" V; g: }$ t7 r& r& A
}
, a# [( l% A/ i& r3 w9 U% _, j& W! [+ j }
# G' ?7 p8 A+ {( I9 d/ C0 i" C! o' }4 [
ixstart = 1;
6 A+ a5 s8 k4 f& N) w yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];3 B3 ]* ]6 p; r7 c t9 e# x$ ~# C
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 L1 v8 O( P/ p ix = 2;0 w$ | l$ g# P
exitg1 = false;$ D( _* X9 x5 w1 O: D! ~
while ((!exitg1) && (ix < 81001)) {
, A0 A/ W1 |7 w+ W/ _ ixstart = ix;
) f* d0 L k! I8 P3 ?$ B if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
2 M/ @+ y5 x6 V yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];+ x2 R6 b. d0 e# p: }, N
exitg1 = true;
0 O9 Y5 ~$ ]% s } else {
1 X# E) M7 U/ U ix++;% F; j! c5 C1 A" y ~' @% I
}2 M H2 g) S' W, i
}* e1 P" J$ z' w
}% [" f$ ]- {0 v
: g6 Z( G. b0 v2 w7 X1 d+ U8 N if (ixstart < 81000) {7 Z- B8 j: x. N$ a4 v; I
while (ixstart + 1 < 81001) {
+ @( b/ d, E& D, m if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {- ^& l0 t. u5 {
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
) l% A* m8 T# J6 J5 l7 s1 M }% ~/ v7 ^3 m" N+ F
7 Q3 N2 N( x0 u- ?' n G4 J ixstart++;, z! g8 d+ q |. `
}
$ \& e* q3 C* T }) x5 c% r/ E4 B& Y+ \2 ~1 d
4 z; d4 N$ |1 v9 I
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);% z, h: Y$ \, M/ x
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
P& p3 l, n2 d" ^9 g3 R yiDuanShuJu_mean = mtmp;
: Z3 t( j2 o+ ` }" [; n, u6 Z- k7 w( [$ X: W9 m
6 Q: p; p% j2 m" c% l0 D /* 找出极值 */; ]/ I: j* S) o/ {. \6 o7 L: G
for (ixstart = 0; ixstart < 81000; ixstart++) {8 d) d" _* _' K# J& g
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;- w/ f; m7 D8 d! D1 }4 Y3 f8 V
}
/ M2 M' `9 \0 V
4 H9 A5 S7 e6 c, s% X% T% B& } --------------帖子字数限制------------------
, F- G/ |# }4 I; K}
# |0 X! ` l+ X- F; q2 R, ?0 x9 O: K6 W9 J
7 }/ P3 y7 O! Y1 W. g' T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|