码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 画音频波形曲线 根据音频数据版

时间:2016-04-06 00:27:08      阅读:334      评论:0      收藏:0      [点我收藏+]

标签:

效果图

 
 
技术分享
 
 
DrawView.h
 
 
[objc]  
#import <UIKit/UIKit.h>  
  
@interface DrawView : UIView  
  
@property shortshort *drawBuffer;  
@property int  dataLen;  
@property floatfloat *outRel;  
@property floatfloat *outImg;  
@property int bias;  
@property int wSize;  
- (void)genKernel;  
  
  
@end  
 
DrawView.m
 
[objc]  
#import "DrawView.h"  
  
@implementation DrawView  
  
#define KSIZE 20  
#define BIAS 10000  
  
static double fk[KSIZE] = {0};  
static double _filterData[2048];  
  
  
  
- (void)genKernel  
{  
    double fc = .05;  
    for (int i = 0; i < KSIZE; i++)  
    {  
        if ((i - KSIZE/2) == 0)fk[i] = 22 * M_PI *fc;  
        if ((i - KSIZE/2) != 0 )fk[i] = sin(22 * M_PI * fc * (i - KSIZE/2))/(i - KSIZE/2);  
        fk[i] = fk[i] * (0.54 - 0.46 * cos(22 * M_PI * i / KSIZE ));  
          
    }  
      
    double sum = 0;  
    for (int m = 0; m < KSIZE; m++)  
        sum+=fk[m];  
      
    for (int n = 0; n < KSIZE; n++)  
        fk[n]/=sum;  
}  
  
- (void)improveSpectrum  
{  
    memset(_filterData, 0x0, sizeof(double) * 1024);  
    short transData[(int)self.wSize];  
    memcpy(transData, self.drawBuffer+_bias, _wSize * sizeof(short));  
    for (int i = 0; i < _wSize; i++)  
    {  
        for (int j = 0; j < KSIZE; j++)  
        {  
            _filterData[i] = _filterData[i] + transData[ i - j] * fk[j];  
        }  
    }  
      
}  
  
  
- (id)initWithFrame:(CGRect)frame  
{  
    self = [super initWithFrame:frame];  
    if (self) {  
    }  
    return self;  
}  
  
  
  
- (void)drawRect:(CGRect)rect  
{  
    float delta = 320. / _wSize;  
    [self improveSpectrum];  
  
    [[UIColor grayColor] set];  
    UIRectFill ([self bounds]);  
      
      
    CGContextRef currentContext = UIGraphicsGetCurrentContext();  
    CGContextBeginPath(currentContext);  
    CGContextMoveToPoint(currentContext, 0., 230.);  
    CGContextAddLineToPoint(currentContext, 320., 230.);  
    [[UIColor blueColor] setStroke];  
    CGContextStrokePath(currentContext);  
  
      
    CGContextBeginPath(currentContext);  
    CGContextMoveToPoint(currentContext, 0., 230.);  
    for (int i = 0; i < _wSize; i++)  
    {  
        CGFloat x = i * delta;  
        CGFloat y = _filterData[i] / 150.0 + 230.0;  
          
          
          
          
          
        CGContextAddLineToPoint(currentContext, x, y);  
          
    }  
    [[UIColor redColor] setStroke];  
    CGContextStrokePath(currentContext);  
  
}  
  
  
@end  
 
 
 
ViewController.h
 
 
 
[objc]  
#import <UIKit/UIKit.h>  
  
@interface ViewController : UIViewController  
  
@end  
 
 
 
 
 
 
 
 
ViewController.m
 
 
 
[objc] 
#import "ViewController.h"  
#import "DrawView.h"  
  
  
struct WavInfo  
{  
    int   size;  
    char  *data;  
    short channels;  
    short block_align;  
    short bits_per_sample;  
    unsigned long sample_rate;  
    unsigned long format_length;  
    unsigned long format_tag;  
    unsigned long avg_bytes_sec;  
      
};  
  
  
@interface ViewController ()  
  
@end  
  
void decodeWaveInfo(const charchar *fname, struct WavInfo *info)  
{  
      
    FILEFILE *fp;  
    fp = fopen(fname, "rb");  
  
    if(fp)  
    {  
        char id[5];  
        unsigned long dataSize,size;  
          
        fread(id, sizeof(char), 4, fp);  
        id[4]=‘\0‘;  
        if (!strcmp(id, "RIFF"))  
        {  
            fread(&size, sizeof(unsigned long), 1, fp);//read file size  
            fread(id, sizeof(char), 4, fp);//read wave  
            id[4]=‘\0‘;  
              
            if (!strcmp(id, "WAVE"))  
            {  
                fread(id, sizeof(char), 4, fp);  
                fread(&info->format_length, sizeof(unsigned long), 1, fp);  
                fread(&info->format_tag, sizeof(short), 1, fp);  
                fread(&info->channels, sizeof(short), 1, fp);  
                fread(&info->sample_rate, sizeof(unsigned long), 1, fp);  
                fread(&info->avg_bytes_sec, sizeof(unsigned long), 1, fp);  
                fread(&info->block_align, sizeof(short), 1, fp);  
                fread(&info->bits_per_sample, sizeof(short), 1, fp);  
                fread(id, sizeof(char), 4, fp);  
                fread(&dataSize, sizeof(unsigned long), 1, fp);  
                info->size = dataSize;  
                info->data = ( charchar *)malloc(sizeof(char)*dataSize);  
                fread(info->data, sizeof(char), dataSize, fp);  
                  
            }  
            else  
            {  
                printf("Error\n");  
            }  
        }  
        else  
        {  
            printf("Error\n");  
        }  
        fclose(fp);  
    }  
}  
  
@implementation ViewController  
  
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    NSString *path = [[NSBundle mainBundle] pathForResource:@"effect1" ofType:@"wav"];  
    struct WavInfo wavInfo;  
    decodeWaveInfo([path UTF8String], &wavInfo);  
      
      
    DrawView *d = (DrawView *)self.view;  
    d.drawBuffer = (shortshort *)malloc(sizeof(short) * wavInfo.size / 2 );  
    [d genKernel];  
    d.dataLen = wavInfo.size / 2;  
    d.wSize = 256;  
    d.bias = 0;  
      
    int n = 0;  
    for (int m = 0; m < wavInfo.size / 2; m++)  
    {  
        d.drawBuffer[n++] = wavInfo.data[m * 2 + 1] << 8 | wavInfo.data[m * 2];  
    }  
      
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)];  
    [self.view addGestureRecognizer:pan];  
      
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];  
    [self.view addGestureRecognizer:pinch];  
  
      
}  
  
#pragma mark -  
#pragma mark Gesture Recognizer callback  
  
- (void)dragView:(UIPanGestureRecognizer *)recognizer  
{  
    DrawView *d = (DrawView *)self.view;  
      
    CGPoint p = [recognizer translationInView:self.view];  
    NSLog(@"translate point is : %@",NSStringFromCGPoint(p));  
    d.bias -= p.x;  
      
    [self.view setNeedsDisplay];  
}  
  
- (void)pinchView:(UIPinchGestureRecognizer *)recognizer  
{  
    DrawView *d = (DrawView *)self.view;  
      
    if (recognizer.scale > 1.0)  
    {  
        if (d.wSize > 128)  
        {  
            d.wSize *= 0.95;  
        }  
    }  
    else  
    {  
        if (d.wSize < 1024)  
        {  
            d.wSize *= 1.05;  
        }  
    }  
      
    [self.view setNeedsDisplay];  
}  
  
  
- (void)didReceiveMemoryWarning  
{  
    [super didReceiveMemoryWarning];  
    // Dispose of any resources that can be recreated.  
}  
  
@end  
 

iOS 画音频波形曲线 根据音频数据版

标签:

原文地址:http://www.cnblogs.com/Free-Thinker/p/5357439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!