assertの挿入箇所が適切ではありません.assertに与えられた条件式はその挿入箇所で評価されますので,被演算対象に対しては値が確定した演算前,代入対象については値が確定した代入後,可及的速やかに適用する必要があります.
// ap_fixed_test.c
// 2017/02/12 by marsee
#include <assert.h>
#include <ap_fixed.h>
typedef ap_fixed<16,8, AP_RND, AP_SAT> ap_xfix_def;
//typedef ap_ufixed<16,8, AP_RND, AP_SAT> ap_xfix_def;
int ap_fixed_test(ap_xfix_def in0, ap_xfix_def in1, int limit,
ap_xfix_def *out){
ap_xfix_def temp;
assert(in0 > (ap_xfix_def)(-1.0) && in0 < (ap_xfix_def)1.0);
temp = in0;
assert(temp > (ap_xfix_def)(-10.0) && temp < (ap_xfix_def)10.0);
//assert(limit <= 10);
for (int i=0; i<limit; i++){
#pragma HLS LOOP_TRIPCOUNT min=1 max=10 avg=2
assert(temp > (ap_xfix_def)(-10.0) && temp < (ap_xfix_def)10.0);
temp = temp * (ap_xfix_def)2.0;
assert(temp > (ap_xfix_def)(-10.0) && temp < (ap_xfix_def)10.0);
}
assert(temp > (ap_xfix_def)(-10.0) && temp < (ap_xfix_def)10.0);
assert(in1 > (ap_xfix_def)(-2.0) && in1 < (ap_xfix_def)2.0);
*out = temp * in1;
return(0);
}
// unsharp_mask_axis.cpp
// 2015/09/24 by marsee
// ap_fixedバージョン 2015/10/04
//
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <ap_int.h>
#include <ap_fixed.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <iostream>
#include "unsharp_mask_axis.h"
using namespace std;
// アンシャープマスキング・フィルタ
// x0y0 x1y0 x2y0 -k -j -k
// x0y1 x1y1 x2y1 -k 9+8k -k x 1/9
// x0y2 x1y2 x2y2 -k -k -k
//
// k : 鮮鋭化の強さ(固定小数点) , k != 0
// num_adec_k : Kの小数点の位置
//
int unsharp_masking(int pix_mat[3][3], k_fixed_td k_fixed)
{
ap_ufixed<8, 8, AP_RND, AP_SAT> xy[3][3];
int result=0;
ap_ufixed<8, 8, AP_RND, AP_SAT> z;
x1y1_fixed_td x1y1;
y_fixed_td y;
/*ap_ufixed<8, 8> xy[3][3]; int result=0; ap_ufixed<8, 8, AP_RND, AP_SAT> z; x1y1_fixed_td x1y1; y_fixed_td y;*/
x1y1 = (x1y1_fixed_td)9/(x1y1_fixed_td)k_fixed + (x1y1_fixed_td)8; // ビット長は 9+8 が2^5=32 より小さく、k_fixedで割るので、NUM_ADC_Kが増える可能性がある
for (int i=0; i<=16; i += 8){
for (int j=0; j<3; j++){
for (int k=0; k<3; k++){
xy[j][k] = (pix_mat[j][k] >> i) & 0xff; // RGBのいずれかを抽出
}
}
y = -xy[0][0] -xy[0][1] -xy[0][2]
-xy[1][0] +x1y1*xy[1][1] -xy[1][2]
-xy[2][0] -xy[2][1] -xy[2][2];
assert(y > (y_fixed_td)(-10) && y < (y_fixed_td)(10));
y = (k_fixed * y)/(y_fixed_td)9;
assert(y > (y_fixed_td)(-10) && y < (y_fixed_td)(10));
y = y+(y_fixed_td)0.5; // 四捨五入
assert(y > (y_fixed_td)(-10) && y < (y_fixed_td)(10));
if (y < 0)
z = 0;
else if (y > 255)
z = 255;
else
z = y;
result += z.to_int()<<i; // i=0 : blue, i=8 : green, i=16 : red
}
return(result);
}
// unsharp_mask_axis.h
// 2015/09/26 by marsee
#ifndef __UNSHARP_MASK_AXIS_H_
#define __UNSHARP_MASK_AXIS_H_
//#define HORIZONTAL_PIXEL_WIDTH 1280
//#define VERTICAL_PIXEL_WIDTH 720
#define HORIZONTAL_PIXEL_WIDTH 64
#define VERTICAL_PIXEL_WIDTH 48
#define ALL_PIXEL_VALUE (HORIZONTAL_PIXEL_WIDTH*VERTICAL_PIXEL_WIDTH)
#define PRECISION 6 // 小数点以下の桁数、精度(0 以上の数を指定する)
#define K_BITLEN 4 // k のビット長
#define NUM_ADC_K 2 // k の小数点の位置
typedef ap_ufixed<K_BITLEN, K_BITLEN-NUM_ADC_K> k_fixed_td;
typedef ap_fixed<6+PRECISION+NUM_ADC_K, (6+PRECISION+NUM_ADC_K)-PRECISION> x1y1_fixed_td;
typedef ap_fixed<6+PRECISION+NUM_ADC_K+8+3, (6+PRECISION+NUM_ADC_K+8+3)-PRECISION> y_fixed_td;
#define K 2.5 // 鮮鋭化の強さ
#endif
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |