No BSD License  

Highlights from
editable FIR response

image thumbnail
from editable FIR response by Matthes
GUI to manually edit arbitrary FIR magnitunde response

FIR_edit(varargin)
function varargout = FIR_edit(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @FIR_edit_OpeningFcn, ...
                   'gui_OutputFcn',  @FIR_edit_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before FIR_edit is made visible.
function FIR_edit_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

% Update handles structure
guidata(hObject, handles);


setappdata(handles.Yup,'y',20);
setappdata(handles.nfft,'Nfft',4096);
plotcurve(handles);


% --- Outputs from this function are returned to the command line.
function varargout = FIR_edit_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;

function nfft_Callback(hObject, eventdata, handles)
delete(findobj('Type','line','Color',[0.3 0.3 0.3],'LineStyle','--'));
nfft=get(hObject,'String');
setappdata(handles.nfft,'Nfft',str2double(nfft));
plotcurve(handles);

% --- Executes during object creation, after setting all properties.
function nfft_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in store.
function store_Callback(hObject, eventdata, handles)
filtercurve=10.^(getappdata(hObject,'filtercurve')./20);
H_filter=vertcat(filtercurve,filtercurve(end:-1:1));
filt=hamming(length(H_filter)).*circshift(ifft(H_filter,'symmetric'),length(H_filter)/2);
if get(handles.minph,'Value')==1
    filt=minph(filt);
end
filt=filt./max(abs(filt));
prompt = {'Enter name for edited FIR :'};
dlg_title = 'Name';
num_lines=1;
def = {'editFIR'};
newname = inputdlg(prompt,dlg_title,num_lines,def);
newname=cell2mat(newname);
assignin('base',newname,filt);

function f_Callback(hObject, eventdata, handles)
freq=str2double(get(hObject,'String'));
if isnan(freq) ~= 1 && freq >= 20 && freq <= 22000
    cgval=getappdata(handles.figure1,'cgval');
    cfval=getappdata(handles.figure1,'cfval');
    lastdot=findobj('Tag','Dot','XData',cfval,'YData',cgval);
    set(lastdot,'XData',freq);
    setappdata(handles.figure1,'cfval',freq);
    plotcurve(handles);
end

% --- Executes during object creation, after setting all properties.
function f_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function g_Callback(hObject, eventdata, handles)
gain=str2double(get(hObject,'String'));
if isnan(gain) ~= 1 
    cgval=getappdata(handles.figure1,'cgval');
    cfval=getappdata(handles.figure1,'cfval');
    lastdot=findobj('Tag','Dot','XData',cfval,'YData',cgval);
    set(lastdot,'YData',gain);
    setappdata(handles.figure1,'cgval',gain);
    plotcurve(handles);
end

% --- Executes during object creation, after setting all properties.
function g_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in reset.
function reset_Callback(hObject, eventdata, handles)
delete(findobj('Type','line','Tag','Dot','Color',[1 0 0]));
plotcurve(handles);

% --- Executes on button press in close.
function close_Callback(hObject, eventdata, handles)
button = questdlg('Store filter?' );
if strcmp(button,'No')==1
    close FIR_edit;
end
if strcmp(button,'Yes')==1
    store_Callback(hObject, eventdata, handles);
    uiwait;
    close FIR_edit;
end

% --- Executes on button press in Ydwn.
function Ydwn_Callback(hObject, eventdata, handles)
y=getappdata(handles.Yup,'y')-5;
if y > 0
    setappdata(handles.Yup,'y',y);
    plotcurve(handles);
end

% --- Executes on button press in Yup.
function Yup_Callback(hObject, eventdata, handles)
y=getappdata(handles.Yup,'y')+5;
setappdata(handles.Yup,'y',y);
plotcurve(handles);

function plotcurve(handles)

delete(findobj(gcf,'Type','line','Color',[0 0 1]));
dots = findobj('Tag','Dot','Color',[1 0 0]);
Nfft=getappdata(handles.nfft,'Nfft');
freq=(0:44100/Nfft:44099)';
f16=find(freq<16,1,'last');
freq=freq(1:end/2);
if isempty(dots)
    line(freq(f16),0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(63,0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(250,0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(1000,0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(4000,0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(16000,0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    line(freq(end),0,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    dots = findobj('Tag','Dot');
    cmenu = uicontextmenu;
    set(dots,'UIContextMenu',cmenu);    
    uimenu(cmenu, 'Label', 'delete','Callback','delete(gco);');
    hold on
end
fixpoints=[get(dots,'XData') get(dots,'YData')];
fixpoints=sortrows(cell2mat(fixpoints));
filtercurve= interp1(vertcat(1,fixpoints(:,1)),vertcat(0,fixpoints(:,2)),freq,'cubic');
setappdata(handles.store,'filtercurve',filtercurve);
curve=plot(freq,filtercurve);
set(curve,'Color',[0 0 1],'LineWidth',2,'LineStyle','-','Marker','none');
set(get(gca,'YLabel'),'String','amplitude / dB','FontSize',10,'FontWeight','bold')
set(get(gca,'XLabel'),'String','frequency / Hz','FontSize',10,'FontWeight','bold')
set(handles.axes,...
'FontWeight','bold',...
'XGrid','on',...
'XMinorGrid','on',...
'XTick',[22,32,45,63,90,125,180,250,355,500,700,1000,1400,2000,3000,4000,5600,8000,11000,16000,22000],...
'XTickLabel',{'22','32','45','63','90','125','180','250','355','500','700','1k','1.4k','2k','3k','4k','5.6k','8k','11k','16k','22k'},...
'XScale','log','YGrid','on')
y=getappdata(handles.Yup,'y');
axis([22 16000 -y y]);
box on
hold on
filtercurve=findobj('Type','line','Tag','Dot','Color',[1 0 0]);
uistack(filtercurve,'top');
uistack(dots,'top');

% --- Executes on mouse press over figure background, over a disabled or
% --- inactive control, or over an axes background.
function figure1_WindowButtonDownFcn(hObject, eventdata, handles)

if strcmp(get(gco,'Tag'),'Dot') ~= 1
    cp = get(gca,'CurrentPoint');
    xv = cp(1,1);       
    yv = cp(1,2);
    dot=line(xv,yv,'LineWidth',3,'MarkerSize',3,'Color',[1 0 0],'Tag','Dot','Marker','diamond','LineStyle','none');
    cmenu = uicontextmenu;
    set(dot,'UIContextMenu',cmenu);    
    uimenu(cmenu, 'Label', 'delete', ...
    'Callback','delete(gco);');
    plotcurve(handles);
    setappdata(handles.figure1,'move',1);
    figure1_WindowButtonMotionFcn(hObject, eventdata, handles);
elseif strcmp(get(gco,'Tag'),'Dot') == 1
    setappdata(handles.figure1,'move',1);
end

% --- Executes on mouse motion over figure - except title and menu.
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
if strcmp(get(gco,'Tag'),'Dot')==1 && getappdata(handles.figure1,'move') == 1
    set(gcf,'DoubleBuffer','on');
    cp = get(gca,'CurrentPoint');
    xv = cp(1,1);       
    yv = cp(1,2);
    set(gco,'XData',xv,'YData',yv);
    set(handles.f,'String',round(xv));
    set(handles.g,'String',0.1*round(10*yv));
    plotcurve(handles);
end


function figure1_WindowButtonUpFcn(hObject, eventdata, handles)
if strcmp(get(gco,'Tag'),'Dot')
    xv = get(gco,'XData');       
    yv = get(gco,'YData');
    setappdata(handles.figure1,'cfval',xv);
    setappdata(handles.figure1,'cgval',yv);
end
setappdata(handles.figure1,'move',0);


% --- Executes on button press in ok.
function ok_Callback(hObject, eventdata, handles)
filtercurve=10.^(getappdata(handles.store,'filtercurve')./20);
H_filter=vertcat(filtercurve,filtercurve(end:-1:1));
filt=hamming(length(H_filter)).*circshift(ifft(H_filter,'symmetric'),length(H_filter)/2);
if get(handles.minph,'Value')==1
    filt=minph(filt);
end
h_eq=filt./max(abs(filt));
assignin('base','GraphicFIRFilter',h_eq);
sig=getappdata(handles.opensig,'sig');
sig_filt=evalin('base',['fftfilt(GraphicFIRFilter,' sig ');']);
evalin('base','clear GraphicFIRFilter;');

prompt = {'Enter name for filtered signal :'};
dlg_title = 'Name';
num_lines=1;
def = {[sig '_FIR']};
newname = inputdlg(prompt,dlg_title,num_lines,def);
newname=cell2mat(newname);
assignin('base',newname,sig_filt./max(max(abs(sig_filt))));


% --- Executes on selection change in opensig.
function opensig_Callback(hObject, eventdata, handles)
sig = evalin('base','who');
set(hObject,'String',sig)
set(hObject,'String',sig);
list_entries = get(hObject,'String');
index_selected = get(hObject,'Value');
sig = list_entries{index_selected};
setappdata(hObject,'sig',sig);


% --- Executes during object creation, after setting all properties.
function opensig_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function [h_min,h_max] = minph(h)

n = length(h);
h_cep = real(ifft(log(abs(fft(h(:,1))))));

odd = fix(rem(n,2));
wn = [1; 2*ones((n+odd)/2-1,1) ; ones(1-rem(n,2),1); zeros((n+odd)/2-1,1)];
h_min = zeros(size(h(:,1)));
h_min(:) = real(ifft(exp(fft(wn.*h_cep(:)))));
h_max=ifft(fft(h(:,1))./fft(h_min));

if size(h,2)==2
    h_cep = real(ifft(log(abs(fft(h(:,2))))));
    odd = fix(rem(n,2));
    wn = [1; 2*ones((n+odd)/2-1,1) ; ones(1-rem(n,2),1); zeros((n+odd)/2-1,1)];
    h_minr = zeros(size(h(:,2)));
    h_minr(:) = real(ifft(exp(fft(wn.*h_cep(:)))));
    h_maxr=ifft(fft(h(:,2))./fft(h_minr));
    h_min=[h_min h_minr];
    h_max=[h_max h_maxr];
end

Contact us at files@mathworks.com