[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.css\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2018 Hideki Kawahara All Rights Reserved\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Legacy STRAIGHT\n\nThe legacy-STRAIGHT is a collection of speech analysis, modification and resynthesis tools. \n\n## Installation\n\nSet MATLAB path to \"src\" directory.\n\n## Quick start\n\nPaste the following code to MATLAB command window. It generates copy-synthesized output to the variable \"syntheszed_signal\".\n\n    [x, fs] = audioread('vaiueo2d.wav'); \n    f0raw = MulticueF0v14(x,fs); \n    ap = exstraightAPind(x,fs,f0raw);\n    n3sgram=exstraightspec(x,f0raw,fs);\n    syntheszed_signal = exstraightsynth(f0raw,n3sgram,ap,fs);\n\nFor running this using GNU Octave, please load signal package.\n\n```\npkg load signal\n```\n\n## Release note\n\n* [July 19, 2018; Prerelease]\nThe \"Quick start\" example also runs properly on GNU Octave 4.4.0 on macOS High Sierra (10.13.6)\n\n* [July 17, 2018: Prerelease]\nAdded documemts. The first release will be on July 24, 2018.\n\n* [July 16, 2018: Prerelease]\nThis release is a copy of the latest version which was distributed by the first author (Hideki Kawahara) to academic communities. The version is named STRAIGHTV40_007. The last update was July 17, 2016. Kansai TLO has also licensed the legacy-STRAIGHT for commercial use. The licensees of the legacy-STRAIGHT agreed to make the legacy-STRAIGHT open to the public after July 15, 2018. \n\n## Acknowledgment\n\nThe legacy-STRAIGHT was supported by many coauthors, contributors, and funding agencies. \n\n***\n\nHideki Kawahara,\nJuly 16, 2018 (start date)"
  },
  {
    "path": "doc/README.md",
    "content": "# Documents for legacy-STRAIGHT\n\nThis directory consists of documents prepared for the legacy-STRAIGHT.\n\nPlease note that the legacy-STRAIGHT is an ended project. The latest extended morphing framework uses the TANDEM-STRAIGHT. Dr. Masanori Morise, who invented the core component of the TANDEM-STRAIGHT, also distributes an open-source VOCODER framework called WORLD. [Link to mmorise/WORLD](https://github.com/mmorise/World)\n\n## HTML and PDF documents (in this directory)\n\n* Getting started with command mode STRAIGHT (May 5, 2007)\n\t* file: gettingStartedV40_006b.zip (archived HTML document)\n\t* file: gettingStartedV40_006b.pdf (PDF version of the HTML document)\n* Auditory morphing using STRAIGHT (This framwork is outdated.)(November 7, 2005)\n\t* file: morphingWithSTRAIGHT.tar.gz (archived HTML document)\n\t* file: morphingWithSTRAIGHTe.pdf (PDF version of the HTML document)\n* STRAIGHT technical report (In Japanese)\n\t* file: straightTechRep.pdf (PDF focument)\n\n## Publications\n\n* Hideki Kawahara, Ikuyo Masuda-Katsuse and Alain de Cheveigne: Restructuring speech representations using a pitch-adaptive time-frequency smoothing and an instantaneous-frequency-based F0 extraction: Possible role of a repetitive structure in sounds, Speech Communication, 27, pp.187-207 (1999) [Link](https://doi.org/10.1016/S0167-6393(98)00085-5) \n\t* This is the first journal paper on STRAIGHT. Spectral envelope estimation is still relevant. Descriptions on the source information are outdated.\n* Hideki Kawahara: STRAIGHT, Exploration of the other aspect of VOCODER: Perceptually isomorphic decomposition of speech sounds, Acoustic Science and Technology, Vol.27, No.6, (2006)[Link to pdf](http://www.jstage.jst.go.jp/article/ast/27/6/349/_pdf)\n\t* This is a featured paper introducing the underlying concept of STRAIGHT.\n* Hideki Kawahara, Alain de Cheveigné, Hideki Banno, Toru Takahashi and Toshio Irino, Nearly Defect-free F0 Trajectory Extraction for Expressive Speech Modifications based on STRAIGHT, Proc. Interspeech2005, Lisboa, pp.537-540, Sept. 2005.[Link to pdf](https://www.isca-speech.org/archive/archive_papers/interspeech_2005/i05_0537.pdf)\n\t* This conference paper introduces the latest F0 extractor for the legacy-STRAIGHT, called NDF. The performance of NDF is still competitive in practical situations.\n\n## Link\n\n* [Hideki Kawahara](http://www.wakayama-u.ac.jp/~kawahara/index_e.html)\n\n***\nLast update: Thu Oct 18 14:12:53 JST 2018\n\n\n"
  },
  {
    "path": "morphing_src/createMobject.m",
    "content": "function mObject=createMobject\n%   Create Mobjcet for morphing\n%   mObject=createMobject\n\n%   Designed and coded by Hideki Kawahara\n%   25/February/2005\n%   14/October/2005 Added creator information\n\nmObject.date = datestr(now);\nmObject.pwd = pwd;\nmObject.waveform = [];\nmObject.samplingFrequency = 44100; % default frequency\nmObject.F0 = [];\nmObject.vuv = [];\nmObject.spectrogram = [];\nmObject.aperiodicityIndex = [];\nmObject.frameUpdateInterval = 1; % default frame is 1ms\nmObject.anchorTimeLocation = []; \nmObject.maximumFrequencyPoints = 9; % default max frequency anchor points\nmObject.anchorFrequency = [];\nmObject.F0extractionConditions = [];\nmObject.SpectrumExtractionConditions = [];\nmObject.creatorInformation = which('createMobject');\n"
  },
  {
    "path": "morphing_src/directSTRAIGHTmorphing.m",
    "content": "function mObject3 = directSTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n%   Morphing based on direct mixing of STRAIGHT parameters\n%   (Without time alignment)\n%   mObject3 = directSTRAIGHTmorphing(mObject1,mObject2,mRate);\n\n%   Designed and coded by Hideki Kawahara\n%   27/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n\nif mObject1.samplingFrequency ~= mObject2.samplingFrequency\n    mObject3 = [];\n    return\nend;\nif mObject1.frameUpdateInterval ~= mObject2.frameUpdateInterval\n    mObject3 = [];\n    return\nend;\n\nnw1 = length(mObject1.F0);\nnw2 = length(mObject2.F0);\n[nr1,nc1] = size(mObject1.spectrogram);\n[nr2,nc2] = size(mObject2.spectrogram);\nnr3 = max(nr1,nr2);\nnc3 = max(max(nc1,nc2),max(nw1,nw2));\nnsg = zeros(nr3,nc3);\nnSgram = zeros(nr3,nc3);\nap = zeros(nr3,nc3);\nf0 = zeros(nc3);\nnVoice = zeros(nc3);\n\nswitch mixMethod\n    case 'linear'\n        nsg(1:nr1,1:nc1) = (1-mRate)*mObject1.spectrogram;\n        nSgram(1:nr1,1:nc1) = nSgram(1:nr1,1:nc1)+(1-mRate);\n        nsg(1:nr2,1:nc2) = mRate*mObject2.spectrogram+nsg(1:nr2,1:nc2);\n        nSgram(1:nr2,1:nc2) = nSgram(1:nr2,1:nc2)+mRate;\n        nsg = nsg./nSgram;\n    case 'log'\n        nsg(1:nr1,1:nc1) = (1-mRate)*log(mObject1.spectrogram);\n        nSgram(1:nr1,1:nc1) = nSgram(1:nr1,1:nc1)+(1-mRate);\n        nsg(1:nr2,1:nc2) = mRate*log(mObject2.spectrogram)+nsg(1:nr2,1:nc2);\n        nSgram(1:nr2,1:nc2) = nSgram(1:nr2,1:nc2)+mRate;\n        nsg = exp(nsg./nSgram);\nend;\nap(1:nr1,1:nc1) = (1-mRate)*mObject1.aperiodicityIndex;\nap(1:nr2,1:nc2) = mRate*mObject2.aperiodicityIndex+ap(1:nr2,1:nc2);\n\nf0(mObject1.F0>0) = (1-mRate)*log(mObject1.F0(mObject1.F0>0));\nnVoice(mObject1.F0>0) = nVoice(mObject1.F0>0)+(1-mRate);\nf0(mObject2.F0>0) = mRate*log(mObject2.F0(mObject2.F0>0))+f0(mObject2.F0>0);\nnVoice(mObject2.F0>0) = nVoice(mObject2.F0>0)+mRate;\nf0(nVoice>0) = exp(f0(nVoice>0)./nVoice(nVoice>0));\n\nmObject3 = createMobject;\nmObject3 = updateFieldOfMobject(mObject3,'spectrogram',nsg);\nmObject3 = updateFieldOfMobject(mObject3,'aperiodicityIndex',ap);\nmObject3 = updateFieldOfMobject(mObject3,'F0',f0);\n"
  },
  {
    "path": "morphing_src/displayMobject.m",
    "content": "function displayMobject(mObject,fieldname,note)\n%   M-object information display\n%   displayMobject(mObject,fieldname,note);\n\n%   Designed and coded by Hideki Kawahara\n%   27/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   05/Oct./2005 minor bug fix\n\nfs = mObject.samplingFrequency;\ntFrame = mObject.frameUpdateInterval;\nswitch fieldname\n    case 'spectrogram'\n        figure\n        [nrow,ncolumn]=size(mObject.spectrogram);\n        timeSpan = [0 (ncolumn-1)*tFrame];\n        dBsgram = 20*log10(mObject.spectrogram);\n        maxSgramdB = max(max(dBsgram));\n        imagesc(timeSpan, [0 fs/2],max(dBsgram,maxSgramdB-70));\n        axis('xy');\n        set(gca,'fontsize',14);\n        xlabel('time (ms)');\n        ylabel('frequency (Hz)');\n        title([note ' time span 0 ' num2str(timeSpan(2),10) ' (ms) ' datestr(now)]);\n    case 'waveform'\n        figure\n        x = mObject.waveform;\n        timeSpan = (0:length(x)-1)/fs*1000;\n        plot(timeSpan,x);grid on;\n        axis([timeSpan(1) timeSpan(end) 1.1*[min(x) max(x)]]);\n        set(gca,'fontsize',14);\n        xlabel('time (ms)');\n        title([note ' time span 0 ' num2str(round(timeSpan(end)),8) ' (ms) ' datestr(now)]);\n    case {'anchorFrequency', 'anchorTimeLocation'}\n        figure\n        [nrow,ncolumn]=size(mObject.spectrogram);\n        timeSpan = [0 (ncolumn-1)*tFrame];\n        dBsgram = 20*log10(mObject.spectrogram);\n        maxSgramdB = max(max(dBsgram));\n        imagesc(timeSpan, [0 fs/2],max(dBsgram,maxSgramdB-70));\n        axis('xy');\n        set(gca,'fontsize',14);\n        xlabel('time (ms)');\n        ylabel('frequency (Hz)');\n        title([note ' time span 0 ' num2str(timeSpan(2),10) ' (ms) ' datestr(now)]);\n        if length(mObject.anchorTimeLocation)>0\n            hold on;\n            for ii=1:length(mObject.anchorTimeLocation)\n                hh = plot(mObject.anchorTimeLocation(ii)*[1 1],[0 fs/2],'w:');\n                set(hh,'linewidth',2);\n                if sum(mObject.anchorFrequency(ii,:)>0)>0\n                    nFrequency = sum(mObject.anchorFrequency(ii,:)>0);\n                    anchorFrequencyVector = mObject.anchorFrequency(ii,mObject.anchorFrequency(ii,:)>0); % 05/Oct./2005 HK\n                    for jj=1:nFrequency\n                        hh=plot(mObject.anchorTimeLocation(ii),anchorFrequencyVector(jj),'ok');\n                        set(hh,'markersize',9);\n                        set(hh,'linewidth',2);\n                        hh=plot(mObject.anchorTimeLocation(ii),anchorFrequencyVector(jj),'.w');\n                        set(hh,'markersize',7);\n                        set(hh,'linewidth',4);\n                    end;\n                end;\n            end;\n            hold off;\n        end;\nend;\n\n"
  },
  {
    "path": "morphing_src/executeSTRAIGHTanalysisM.m",
    "content": "function mObject = executeSTRAIGHTanalysisM(mObject,optionalParameters);\n%   STRAIGHT analysis for mObject\n%   mObject = executeSTRAIGHTanalysisM(mObject,optionalParameters);\n%\n\n%   Designed and coded by Hideki Kawahara\n%   26/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   20/March/2006 bug fix by T. Takahashi and Kawahara\n\nx = mObject.waveform;\nfs = mObject.samplingFrequency;\nif nargin>1\n    [f0raw,ap,prmF0] = exstraightsource(x,fs,optionalParameters);\n    [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParameters);\nelse\n    [f0raw,ap,prmF0] = exstraightsource(x,fs);\n    [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs);\nend;\nif exist('vuv') % reserved for extension\n    mObject.vuv = vuv;\nelse\n    mObject.vuv = (f0raw ~= 0);\nend;\ntemporalIndexLength=min([length(f0raw),size(n3sgram,2),size(ap,2),length(mObject.vuv)]);\nmObject.F0 = f0raw(1:temporalIndexLength);\nmObject.spectrogram = n3sgram(:,1:temporalIndexLength);\nmObject.aperiodicityIndex = ap(:,1:temporalIndexLength);\nmObject.vuv = mObject.vuv(1:temporalIndexLength);\nmObject.frameUpdateInterval = prmF0.F0frameUpdateInterval;\nmObject.F0extractionConditions = prmF0;\nmObject.SpectrumExtractionConditions = analysisParamsSp;\n"
  },
  {
    "path": "morphing_src/executeSTRAIGHTanalysisMExt.m",
    "content": "function mObject = executeSTRAIGHTanalysisMExt(mObject,optionalParameters);\n%   STRAIGHT analysis for mObject\n%   mObject = executeSTRAIGHTanalysisMExt(mObject,optionalParameters);\n%\n\n%   Designed and coded by Hideki Kawahara\n%   26/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   20/March/2006 bug fix by T. Takahashi and Kawahara\n%   16/Aug./2008 extended for use MulticueF0 as default\n\nx = mObject.waveform;\nfs = mObject.samplingFrequency;\nif nargin>1\n    %[f0raw,ap,prmF0] = exstraightsource(x,fs,optionalParameters);\n    [f0raw,vuv,auxouts,prmF0]=MulticueF0v14(x,fs,optionalParameters);\n    [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParameters);\n    [ap,analysisParams]=exstraightAPind(x,fs,f0raw,optionalParameters);\nelse\n    %[f0raw,ap,prmF0] = exstraightsource(x,fs);\n    [f0raw,vuv,auxouts,prmF0]=MulticueF0v14(x,fs);\n    [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs);\n    [ap,analysisParams]=exstraightAPind(x,fs,f0raw);\nend;\nif exist('vuv') % reserved for extension\n    mObject.vuv = vuv;\nelse\n    mObject.vuv = (f0raw ~= 0);\nend;\ntemporalIndexLength=min([length(f0raw),size(n3sgram,2),size(ap,2),length(mObject.vuv)]);\nmObject.F0 = f0raw(1:temporalIndexLength);\nmObject.spectrogram = n3sgram(:,1:temporalIndexLength);\nmObject.aperiodicityIndex = ap(:,1:temporalIndexLength);\nmObject.vuv = mObject.vuv(1:temporalIndexLength);\nmObject.frameUpdateInterval = prmF0.F0frameUpdateInterval;\nmObject.F0extractionConditions = prmF0;\nmObject.SpectrumExtractionConditions = analysisParamsSp;\nmObject.AperiodicityAnalysisParams = analysisParams;\n"
  },
  {
    "path": "morphing_src/executeSTRAIGHTsynthesisM.m",
    "content": "function [sy,prmS] = executeSTRAIGHTsynthesisM(mObject,optionalParameters)\n%   STRAIGHT synthesis from mObject\n%   sy = executeSTRAIGHTsynthesisM(mObject,optionalParameters);\n%\n\n%   Designed and coded by Hideki Kawahara\n%   27/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   14/March/2005 bug fix on optional paramters\n%   10/June/2006 extension for the new F0 extractor\n\nfs = mObject.samplingFrequency; \nf0raw = mObject.F0;\nif isfield(mObject,'vuv')\n    if length(mObject.vuv) == length(mObject.F0)\n        f0raw = f0raw.*mObject.vuv;\n    end;\nend;\nn3sgram = mObject.spectrogram;\nap = mObject.aperiodicityIndex;\nif nargin>1\n    [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs,optionalParameters);\nelse\n    [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs);\nend;\n"
  },
  {
    "path": "morphing_src/fixDummyObjectSize.m",
    "content": "function dummyObject = fixDummyObjectSize(dummyObject,originalObject);\n\nframeUpdateInterval = dummyObject.frameUpdateInterval;\nendMargin = size(originalObject.spectrogram,2)*frameUpdateInterval-max(originalObject.anchorTimeLocation);\nif size(dummyObject.spectrogram,2)*frameUpdateInterval < max(dummyObject.anchorTimeLocation)+endMargin\n    dummyFrameSize = max(dummyObject.anchorTimeLocation)+endMargin;\n    dimmyFrequencySize = size(originalObject.spectrogram,1);\n    dummyObject.spectrogram = ones(dimmyFrequencySize,dummyFrameSize);\n    dummyObject.aperiodicityIndex = ones(dimmyFrequencySize,dummyFrameSize);\n    dummyObject.F0 = ones(1,dummyFrameSize);\n    dummyObject.vuv = ones(1,dummyFrameSize);\nend;\n"
  },
  {
    "path": "morphing_src/makeLogarithmicLevelDifferenceBasedOnPeaks.m",
    "content": "function mObject = makeLogarithmicLevelDifferenceBasedOnPeaks(mObject,levelDifferenceTable)\n"
  },
  {
    "path": "morphing_src/setAnchorFromRawAnchor.m",
    "content": "function mObject = setAnchorFromRawAnchor(mObject,rawAnchor);\n%   Set anchor points using raw anchor information\n%   mObject = setAnchorFromRawAnchor(mObject,rawAnchor);\n\n%   Designed and coded by Hideki Kawahara\n%   27/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n\nTIMINGmARGIN = 10; % threshould for merging location\n[dm1,indsrt] = sort(rawAnchor(:,1));\nsortedAnchor = rawAnchor(indsrt,1);\nsortedFrequency = rawAnchor(indsrt,2);\nindexNumber = 1:length(sortedAnchor);\n\n%anchorCandidate = sortedAnchor(diff([-100;sortedAnchor])>TIMINGmARGIN);\nanchorIndex = indexNumber(diff([-100;sortedAnchor])>TIMINGmARGIN);\nanchorCandidate = sortedAnchor(anchorIndex);\nmObject.anchorTimeLocation = anchorCandidate; \nnFrequency = mObject.maximumFrequencyPoints; \n\nnAnchor = length(anchorCandidate);\nsortedAnchor(end+1) = sortedAnchor(end)+1;\nanchorIndex(end+1) = anchorIndex(end)+1; % Terminator\nfrequencyAnchor = zeros(nAnchor,nFrequency);\nfor ii=1:nAnchor\n    iFrequency = 0;\n    anchorLocation = 0;\n    for jj=1:min(nFrequency,anchorIndex(ii+1)-anchorIndex(ii)+1)\n        if sortedAnchor((jj-1)+anchorIndex(ii)) < sortedAnchor(anchorIndex(ii+1))\n            frequencyAnchor(ii,jj) = sortedFrequency((jj-1)+anchorIndex(ii));\n            anchorLocation = anchorLocation+sortedAnchor((jj-1)+anchorIndex(ii));\n            iFrequency = iFrequency+1;\n        end;\n    end;\n    if iFrequency>1\n        [dmy1,indsrt] = sort(frequencyAnchor(ii,1:iFrequency));\n        frequencyAnchor(ii,1:iFrequency) = frequencyAnchor(ii,indsrt);\n        mObject.anchorTimeLocation(ii) = anchorLocation/iFrequency;\n    end;\nend;\nmObject.anchorFrequency = frequencyAnchor;\n"
  },
  {
    "path": "morphing_src/timeAlignedDirectSTRAIGHTmorphing.m",
    "content": "function mObject3 = timeAlignedDirectSTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n%   Morphing based on time-aligned mixing of STRAIGHT parameters\n%   mObject3 = timeAlignedDirectSTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n\n%   Designed and coded by Hideki Kawahara\n%   28/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n\nmObject3 = checkForSimilarity(mObject1,mObject2);\nif length(mObject3) ==0;return;end;\ndtFrame = mObject1.frameUpdateInterval;\nendLocation1 = (length(mObject1.F0)-1)*dtFrame; % in ms\nendLocation2 = (length(mObject2.F0)-1)*dtFrame; % in ms\ntimeAnchor1 = [0;mObject1.anchorTimeLocation;endLocation1];\ntimeAnchor2 = [0;mObject2.anchorTimeLocation;endLocation2];\nlocationOn1 = (0:length(mObject1.F0)-1)*dtFrame;\nlocationOn2 = (0:length(mObject2.F0)-1)*dtFrame;\nmapFrom1to2 = interp1(timeAnchor1,timeAnchor2,locationOn1);\n[nr1,nc1] = size(mObject1.spectrogram);\n[nr2,nc2] = size(mObject2.spectrogram);\n\n%---- mixing on mObject1's time axis\nnAxis1 = length(locationOn1); \nnAxis2 = length(locationOn2);\nmorphedF0 = zeros(nAxis1,1);\nmorphedAp = zeros(nr1,nAxis1);\nmorphedSgram = zeros(nr1,nAxis1);\nweightSumF0 = zeros(nAxis1,1);\nfor ii=1:nAxis1\n    mappedIndexOn2 = mapFrom1to2(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn2);\n    iFraction = mappedIndexOn2-iFloor;\n    dAp = iFraction*(mObject2.aperiodicityIndex(:,min(iFloor+1,nAxis2))-mObject2.aperiodicityIndex(:,iFloor));\n    morphedAp(:,ii) = (1-mRate)*mObject1.aperiodicityIndex(:,ii)+mRate*(mObject2.aperiodicityIndex(:,iFloor)+dAp);\n    switch mixMethod\n        case 'linear'\n            dSgram = iFraction*(mObject2.spectrogram(:,min(iFloor+1,nAxis2))-mObject2.spectrogram(:,iFloor));\n            morphedSgram(:,ii) = (1-mRate)*mObject1.spectrogram(:,ii)+mRate*(mObject2.spectrogram(:,iFloor)+dSgram);\n        case 'log'\n            dSgram = iFraction*(log(mObject2.spectrogram(:,min(iFloor+1,nAxis2)))-log(mObject2.spectrogram(:,iFloor)));\n            tmp = (1-mRate)*log(mObject1.spectrogram(:,ii))+mRate*(log(mObject2.spectrogram(:,iFloor))+dSgram);\n            morphedSgram(:,ii) = exp(tmp);\n    end;\n    if mObject1.F0(ii)>0\n        morphedF0(ii) = (1-mRate)*log(mObject1.F0(ii));\n        weightSumF0(ii) = (1-mRate);\n    end;\n    if (mObject2.F0(iFloor)>0) & (mObject2.F0(min(iFloor+1,nAxis2))>0)\n        dF0 = iFraction*(log(mObject2.F0(min(iFloor+1,nAxis2)))-log(mObject2.F0(iFloor)));\n        morphedF0(ii) = mRate*(log(mObject2.F0(iFloor))+dF0)+morphedF0(ii);\n        weightSumF0(ii) = weightSumF0(ii)+mRate;\n    end;\nend;\nmorphedF0(weightSumF0>0) = exp(morphedF0(weightSumF0>0)./weightSumF0(weightSumF0>0));\n\n%----- mapping back onto morphed time axis\ntimeAnchorMorph = (1-mRate)*timeAnchor1 + mRate*timeAnchor2;\nlocationOnMorph = (0:(timeAnchorMorph(end)/dtFrame))*dtFrame;\nmapFormMorphTo1 = interp1(timeAnchorMorph,timeAnchor1,locationOnMorph);\nnAxisMorph = length(locationOnMorph);\nmorphedApOnMorph = zeros(nr1,nAxisMorph);\nmorphedSgramOnMorph = zeros(nr1,nAxisMorph);\nmorphedF0onMorph = zeros(nAxisMorph,1);\nfor ii=1:nAxisMorph\n    mappedIndexOn1 = mapFormMorphTo1(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn1);\n    iFraction = mappedIndexOn1-iFloor;\n    morphedApOnMorph(:,ii) = morphedAp(:,iFloor) ...\n        +iFraction*(morphedAp(:,min(iFloor+1,nAxis1))-morphedAp(:,iFloor));\n    morphedSgramOnMorph(:,ii) = morphedSgram(:,iFloor) ...\n        +iFraction*(morphedSgram(:,min(iFloor+1,nAxis1))-morphedSgram(:,iFloor));\n    if (morphedF0(iFloor)>0) & (morphedF0(min(iFloor+1,nAxis1))>0)\n        dF0 = iFraction*(morphedF0(min(iFloor+1,nAxis1))-morphedF0(iFloor));\n        morphedF0onMorph(ii) = morphedF0(iFloor)+dF0;\n    end;\nend;\nmObject3.F0 = morphedF0onMorph; \nmObject3.aperiodicityIndex = morphedApOnMorph;\nmObject3.spectrogram = morphedSgramOnMorph;\nmObject3.anchorTimeLocation = timeAnchorMorph(2:end-1);\nmObject3.anchorFrequency = (1-mRate)*mObject1.anchorFrequency+mRate*mObject2.anchorFrequency;\n%mObject3 = morphedAp; % This line is a dummy.\n\n%%% ------ Internal function to check for object's similarity\nfunction mObject3 = checkForSimilarity(mObject1,mObject2)\nmObject3 = [];\nif mObject1.samplingFrequency ~= mObject2.samplingFrequency;mObject3 = [];return;end;\nif mObject1.frameUpdateInterval ~= mObject2.frameUpdateInterval;mObject3 = [];return;end;\nif length(mObject1.anchorTimeLocation) ~= length(mObject2.anchorTimeLocation);mObject3 = [];return;end;\nnAnchor = length(mObject1.anchorTimeLocation);\nfor ii=1:nAnchor % check for similarity of anchor structure\n    frequencyAnchor1 = mObject1.anchorFrequency;\n    frequencyAnchor2 = mObject2.anchorFrequency;\n    if (sum(frequencyAnchor1>0) ~= sum(frequencyAnchor2>0)) | ...\n            (sum(frequencyAnchor1<0) ~= sum(frequencyAnchor2<0))\n        return;\n    end;\nend;\nmObject3 = createMobject;\n"
  },
  {
    "path": "morphing_src/timeFrequencySTRAIGHTmorphing.m",
    "content": "function mObject3 = timeFrequencySTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n%   Morphing based on STRAIGHT parameters\n%   mObject3 = timeFrequencySTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n\n%   Designed and coded by Hideki Kawahara\n%   28/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   14/March/2005 bug fix on sampling frequency\n%   01/Oct./2005 bug fix on similarity check\n%   04/Oct./2005 partial morphing extension\n%   18/Oct./2005 direct differential manipulation and API cange\n%   29/Jan./2006 bug fix on boundary conditions\n\nswitch nargin\n    case 0\n        mObject3.morphingObject = createMobject;\n        mixRate.F0 = 0;\n        mixRate.spectrum = 0;\n        mixRate.aperiodicity = 0;\n        mixRate.coordinate = 0;\n        mObject3.mixRate = mixRate;\n        mObject3.mixMethods = {'linear','log','differentialLogarithm'};\n        return\nend;\nmObject3 = checkForSimilarity(mObject1,mObject2);\nmixRate = checkForMorphingConditions(mRate);\nmObject1 = checkForIntegrity(mObject1);\nmObject2 = checkForIntegrity(mObject2);\nfs = mObject1.samplingFrequency;\nif length(mObject3) ==0;return;end;\ndtFrame = mObject1.frameUpdateInterval;\nendLocation1 = (length(mObject1.F0)-1)*dtFrame; % in ms\nendLocation2 = (length(mObject2.F0)-1)*dtFrame; % in ms\ntimeAnchor1 = [0;mObject1.anchorTimeLocation;endLocation1];\ntimeAnchor2 = [0;mObject2.anchorTimeLocation;endLocation2];\nlocationOn1 = (0:length(mObject1.F0)-1)*dtFrame;\nlocationOn2 = (0:length(mObject2.F0)-1)*dtFrame;\nmapFrom1to2 = interp1(timeAnchor1,timeAnchor2,locationOn1);\n[nr1,nc1] = size(mObject1.spectrogram);\n[nr2,nc2] = size(mObject2.spectrogram);\n\n%---- initialize frequency mapping function\nfmapFrom1to2OnTime1 = generateFrequencyMap(mObject1,mObject2);\n\n%---- mixing on mObject1's time axis\nnAxis1 = length(locationOn1); \nnAxis2 = length(locationOn2);\nmorphedF0 = zeros(nAxis1,1);\nmorphedAp = zeros(nr1,nAxis1);\nmorphedSgram = zeros(nr1,nAxis1);\nweightSumF0 = zeros(nAxis1,1);\nfor ii=1:nAxis1\n    mappedIndexOn2 = mapFrom1to2(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn2);\n    iFraction = mappedIndexOn2-iFloor;\n    fIndex = floor(fmapFrom1to2OnTime1(:,ii)/fs*2*(nr1-1))+1;\n    dAp = iFraction*(mObject2.aperiodicityIndex(:,min(iFloor+1,nAxis2))-mObject2.aperiodicityIndex(:,min(iFloor,nAxis2)));\n    ap2on2faxis = mObject2.aperiodicityIndex(:,min(iFloor,nAxis2))+dAp;\n    ap2on1faxis = ap2on2faxis(fIndex);\n    morphedAp(:,ii) = (1-mixRate.aperiodicity)*mObject1.aperiodicityIndex(:,ii)+mixRate.aperiodicity*ap2on1faxis; %04/Oct/2005 HK\n    switch mixMethod\n        case 'linear'\n            dSgram = iFraction*(mObject2.spectrogram(:,min(iFloor+1,nAxis2))-mObject2.spectrogram(:,min(iFloor,nAxis2)));\n            sgram2on2faxis = mObject2.spectrogram(:,min(iFloor,nAxis2))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            morphedSgram(:,ii) = (1-mixRate.spectrum)*mObject1.spectrogram(:,ii)+mixRate.spectrum*sgram2on1faxis;\n        case 'log'\n            dSgram = iFraction*(log(mObject2.spectrogram(:,min(iFloor+1,nAxis2)))-log(mObject2.spectrogram(:,min(iFloor,nAxis2))));\n            sgram2on2faxis = log(mObject2.spectrogram(:,min(iFloor,nAxis2)))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            tmp = (1-mixRate.spectrum)*log(mObject1.spectrogram(:,ii))+mixRate.spectrum*sgram2on1faxis;\n            morphedSgram(:,ii) = exp(tmp);\n        case 'differentialLogarithm'\n            dSgram = iFraction*(mObject2.spectrogram(:,min(iFloor+1,nAxis2))-mObject2.spectrogram(:,min(iFloor,nAxis2)));\n            sgram2on2faxis = mObject2.spectrogram(:,min(iFloor,nAxis2))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            tmp = (1-mixRate.spectrum)*log(mObject1.spectrogram(:,ii))+mixRate.spectrum*sgram2on1faxis;\n            morphedSgram(:,ii) = exp(tmp);\n    end;\n    if mObject1.F0(ii)>0\n        morphedF0(ii) = (1-mixRate.F0)*log(mObject1.F0(ii));\n        weightSumF0(ii) = (1-mixRate.F0);\n    end;\n    if (mObject2.F0(iFloor)>0) & (mObject2.F0(min(iFloor+1,nAxis2))>0)\n        dF0 = iFraction*(log(mObject2.F0(min(iFloor+1,nAxis2)))-log(mObject2.F0(min(iFloor,nAxis2))));\n        morphedF0(ii) = mixRate.F0*(log(mObject2.F0(min(iFloor,nAxis2)))+dF0)+morphedF0(ii);\n        weightSumF0(ii) = weightSumF0(ii)+mixRate.F0;\n    end;\nend;\nmorphedF0(weightSumF0>0) = exp(morphedF0(weightSumF0>0)./weightSumF0(weightSumF0>0));\n\n%----- mapping back onto morphed time axis\ntimeAnchorMorph = (1-mixRate.coordinate)*timeAnchor1 + mixRate.coordinate*timeAnchor2;\nlocationOnMorph = (0:(timeAnchorMorph(end)/dtFrame))*dtFrame;\nmapFormMorphTo1 = interp1(timeAnchorMorph,timeAnchor1,locationOnMorph);\nnAxisMorph = length(locationOnMorph);\nmorphedApOnMorph = zeros(nr1,nAxisMorph);\nmorphedSgramOnMorph = zeros(nr1,nAxisMorph);\nmorphedF0onMorph = zeros(nAxisMorph,1);\n%----- set place holders\nmObject3.samplingFrequency = fs;\nmObject3.F0 = morphedF0onMorph; \nmObject3.aperiodicityIndex = morphedApOnMorph;\nmObject3.spectrogram = morphedSgramOnMorph;\nmObject3.anchorTimeLocation = timeAnchorMorph(2:end-1);\nmObject3.anchorFrequency = (1-mixRate.coordinate)*mObject1.anchorFrequency+mixRate.coordinate*mObject2.anchorFrequency;\n%------ nitialize frequency mapping function\nfmapFromMorphto1OnTimeMorph = generateFrequencyMap(mObject3,mObject1);\nfor ii=1:nAxisMorph\n    mappedIndexOn1 = mapFormMorphTo1(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn1);\n    iFraction = mappedIndexOn1-iFloor;\n    fIndex = floor(fmapFromMorphto1OnTimeMorph(:,ii)/fs*2*(nr1-1))+1;\n    morphedApOnMorph(:,ii) = morphedAp(fIndex,iFloor) ...\n        +iFraction*(morphedAp(fIndex,min(iFloor+1,nAxis1))-morphedAp(fIndex,iFloor));\n    morphedSgramOnMorph(:,ii) = morphedSgram(fIndex,iFloor) ...\n        +iFraction*(morphedSgram(fIndex,min(iFloor+1,nAxis1))-morphedSgram(fIndex,iFloor));\n    if (morphedF0(iFloor)>0) & (morphedF0(min(iFloor+1,nAxis1))>0)\n        dF0 = iFraction*(morphedF0(min(iFloor+1,nAxis1))-morphedF0(iFloor));\n        morphedF0onMorph(ii) = morphedF0(iFloor)+dF0;\n    end;\nend;\nmObject3.F0 = morphedF0onMorph; \nmObject3.aperiodicityIndex = morphedApOnMorph;\nmObject3.spectrogram = morphedSgramOnMorph;\nmObject3.anchorTimeLocation = timeAnchorMorph(2:end-1);\n%mObject3.anchorFrequency = (1-mRate)*mObject1.anchorFrequency+mRate*mObject2.anchorFrequency;\n%mObject3 = fmapFromMorphto1OnTimeMorph; % This line is a dummy.\nreturn;\n\n%%% ------ Internal function to check for object's similarity\nfunction mObject3 = checkForSimilarity(mObject1,mObject2)\nmObject3 = [];\nif mObject1.samplingFrequency ~= mObject2.samplingFrequency;mObject3 = [];return;end;\nif mObject1.frameUpdateInterval ~= mObject2.frameUpdateInterval;mObject3 = [];return;end;\nif length(mObject1.anchorTimeLocation) ~= length(mObject2.anchorTimeLocation);mObject3 = [];return;end;\nnAnchor = length(mObject1.anchorTimeLocation);\nfor ii=1:nAnchor % check for similarity of anchor structure\n    frequencyAnchor1 = mObject1.anchorFrequency(ii,:)';% 01/Oct./2005 by HK\n    frequencyAnchor2 = mObject2.anchorFrequency(ii,:)';% 01/Oct./2005 by HK\n    if (sum(frequencyAnchor1>0) ~= sum(frequencyAnchor2>0)) | ...\n            (sum(frequencyAnchor1<0) ~= sum(frequencyAnchor2<0))\n        display('Warning!! Object structures are inconsistent!'); % 01/Oct./2005 by HK\n        return;\n    end;\nend;\nmObject3 = createMobject;\nm0bject3.samplingFrequency = mObject1.samplingFrequency;\nm0bject3.frameUpdateInterval = mObject1.frameUpdateInterval;\nreturn;\n\n%%%--------\nfunction mixRate = checkForMorphingConditions(mRate);\n%   04/Oct./2005 added by HK\n\nif ~isstruct(mRate)\n    mixRate.F0 = mRate;\n    mixRate.spectrum = mRate;\n    mixRate.aperiodicity = mRate;\n    mixRate.coordinate = mRate;\n    return;\nend;\nmixRate.F0 = mRate.F0;\nmixRate.spectrum = mRate.spectrum;\nmixRate.aperiodicity = mRate.aperiodicity;\nmixRate.coordinate = mRate.coordinate;\nreturn;\n\n%%%--------\nfunction fmapFrom1to2OnTime1 = generateFrequencyMap(mObject1,mObject2);\n\ndtFrame = mObject1.frameUpdateInterval;\nendLocation1 = (length(mObject1.F0)-1)*dtFrame; % in ms\ntimeAnchor1 = [0;mObject1.anchorTimeLocation;endLocation1];\nlocationOn1 = (0:length(mObject1.F0)-1)*dtFrame;\nfs = mObject1.samplingFrequency;\n[nr1,nc1] = size(mObject1.spectrogram);\nnAnchor = length(mObject1.anchorTimeLocation);\nfmapFrom1to2 = zeros(nr1,nAnchor);\nfrequencyAxis = (0:nr1-1)'/(nr1-1)*fs/2;\nnumberOfFrequencyAnchors = zeros(nAnchor,1);\nfor ii=1:nAnchor\n    frequencyAnchor1 = mObject1.anchorFrequency(ii,:)';\n    frequencyAnchor1 = [0;frequencyAnchor1(frequencyAnchor1>0);fs/2];\n    numberOfFrequencyAnchors(ii) = length(frequencyAnchor1(frequencyAnchor1>0));\n    frequencyAnchor2 = mObject2.anchorFrequency(ii,:)';\n    frequencyAnchor2 = [0;frequencyAnchor2(frequencyAnchor2>0);fs/2];\n    fmapFrom1to2(:,ii) = interp1(frequencyAnchor1,frequencyAnchor2,frequencyAxis);\nend;\nfor ii=1:nAnchor\n    if numberOfFrequencyAnchors(ii) == 1\n        if numberOfFrequencyAnchors(min(ii+1,nAnchor)) > 1\n            fmapFrom1to2(:,ii) = fmapFrom1to2(:,min(ii+1,nAnchor));\n        elseif numberOfFrequencyAnchors(max(ii-1,1)) > 1\n            fmapFrom1to2(:,ii) = fmapFrom1to2(:,max(ii-1,1));\n        end;\n    end;\nend;\nfmapFrom1to2 = [fmapFrom1to2(:,1) fmapFrom1to2 fmapFrom1to2(:,nAnchor)];\nfmapFrom1to2OnTime1 = interp1(timeAnchor1,fmapFrom1to2',locationOn1)';\nreturn;\n\n%%%-------\nfunction cleanedUpObject = checkForIntegrity(inputObject);\n\nmaximumIndex = max([length(inputObject.F0), ...\n    size(inputObject.spectrogram,2) ...\n    size(inputObject.aperiodicityIndex,2)]);\nif length(inputObject.F0) < maximumIndex\n    inputObject.F0 = [inputObject.F0(:);inputObject.F0(end)*ones(maximumIndex - length(inputObject.F0),1)];\nend;\nif size(inputObject.spectrogram,2) < maximumIndex\n    numberOfFillIn = maximumIndex-size(inputObject.spectrogram,2);\n    inputObject.spectrogram = [inputObject.spectrogram inputObject.spectrogram(:,end)*ones(1,numberOfFillIn)];\nend;\nif size(inputObject.aperiodicityIndex,2) < maximumIndex\n    numberOfFillIn = maximumIndex-size(inputObject.aperiodicityIndex,2);\n    inputObject.aperiodicityIndex = [inputObject.aperiodicityIndex inputObject.aperiodicityIndex(:,end)*ones(1,numberOfFillIn)];\nend;\ncleanedUpObject = inputObject;\n\n"
  },
  {
    "path": "morphing_src/timeFrequencySTRAIGHTmorphingExt.m",
    "content": "function mObject3 = timeFrequencySTRAIGHTmorphingExt(mObject1,mObject2,mRate,mixMethod);\n%   Morphing based on STRAIGHT parameters\n%   mObject3 = timeFrequencySTRAIGHTmorphing(mObject1,mObject2,mRate,mixMethod);\n\n%   Designed and coded by Hideki Kawahara\n%   28/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n%   14/March/2005 bug fix on sampling frequency\n%   01/Oct./2005 bug fix on similarity check\n%   04/Oct./2005 partial morphing extension\n%   18/Oct./2005 direct differential manipulation and API cange\n%   29/Jan./2006 bug fix on boundary conditions\n%   24/Oct./2006 modificaton of definition\n\nswitch nargin\n    case 0\n        mObject3.morphingObject = createMobject;\n        mixRate.F0 = 0;\n        mixRate.spectrum = 0;\n        mixRate.aperiodicity = 0;\n        mixRate.timeCoordinate = 0;\n        mixRate.freqCoordinate = 0;\n        mObject3.mixRate = mixRate;\n        mObject3.mixMethods = {'linear','log','differentialLogarithm'};\n        return\nend;\nif ~isfield(mObject1,'vuv')\n    mObject1.vuv = (mObject1.F0>0);\nelseif length(mObject1.vuv) == 0\n    mObject1.vuv = (mObject1.F0>0);\nend;\nif ~isfield(mObject2,'vuv')\n    mObject2.vuv = (mObject2.F0>0);\nelseif length(mObject2.vuv) == 0\n    mObject2.vuv = (mObject2.F0>0);\nend;\nmObject3 = checkForSimilarity(mObject1,mObject2);\nmixRate = checkForMorphingConditions(mRate);\nmObject1 = checkForIntegrity(mObject1);\nmObject2 = checkForIntegrity(mObject2);\nfs = mObject1.samplingFrequency;\nif length(mObject3) ==0;return;end;\ndtFrame = mObject1.frameUpdateInterval;\nendLocation1 = (length(mObject1.F0)-1)*dtFrame; % in ms\nendLocation2 = (length(mObject2.F0)-1)*dtFrame; % in ms\ntimeAnchor1 = [0;mObject1.anchorTimeLocation;endLocation1];\ntimeAnchor2 = [0;mObject2.anchorTimeLocation;endLocation2];\nlocationOn1 = (0:length(mObject1.F0)-1)*dtFrame;\nlocationOn2 = (0:length(mObject2.F0)-1)*dtFrame;\nmapFrom1to2 = interp1(timeAnchor1,timeAnchor2,locationOn1);\n[nr1,nc1] = size(mObject1.spectrogram);\n[nr2,nc2] = size(mObject2.spectrogram);\n\n%---- initialize frequency mapping function\nfmapFrom1to2OnTime1 = generateFrequencyMap(mObject1,mObject2);\n\n%---- mixing on mObject1's time axis\nnAxis1 = length(locationOn1); \nnAxis2 = length(locationOn2);\nmorphedF0 = zeros(nAxis1,1);\nmorphedvuv = zeros(nAxis1,1);\nmorphedAp = zeros(nr1,nAxis1);\nmorphedSgram = zeros(nr1,nAxis1);\nweightSumF0 = zeros(nAxis1,1);\nfor ii=1:nAxis1\n    mappedIndexOn2 = mapFrom1to2(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn2);\n    iFraction = mappedIndexOn2-iFloor;\n    fIndex = floor(fmapFrom1to2OnTime1(:,ii)/fs*2*(nr1-1))+1;\n    dAp = iFraction*(mObject2.aperiodicityIndex(:,min(iFloor+1,nAxis2))-mObject2.aperiodicityIndex(:,min(iFloor,nAxis2)));\n    ap2on2faxis = mObject2.aperiodicityIndex(:,min(iFloor,nAxis2))+dAp;\n    ap2on1faxis = ap2on2faxis(fIndex);\n    morphedAp(:,ii) = (1-mixRate.aperiodicity)*mObject1.aperiodicityIndex(:,ii)+mixRate.aperiodicity*ap2on1faxis; %04/Oct/2005 HK\n    switch mixMethod\n        case 'linear'\n            dSgram = iFraction*(mObject2.spectrogram(:,min(iFloor+1,nAxis2))-mObject2.spectrogram(:,min(iFloor,nAxis2)));\n            sgram2on2faxis = mObject2.spectrogram(:,min(iFloor,nAxis2))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            morphedSgram(:,ii) = (1-mixRate.spectrum)*mObject1.spectrogram(:,ii)+mixRate.spectrum*sgram2on1faxis;\n        case 'log'\n            dSgram = iFraction*(log(mObject2.spectrogram(:,min(iFloor+1,nAxis2)))-log(mObject2.spectrogram(:,min(iFloor,nAxis2))));\n            sgram2on2faxis = log(mObject2.spectrogram(:,min(iFloor,nAxis2)))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            tmp = (1-mixRate.spectrum)*log(mObject1.spectrogram(:,ii))+mixRate.spectrum*sgram2on1faxis;\n            morphedSgram(:,ii) = exp(tmp);\n        case 'differentialLogarithm'\n            dSgram = iFraction*(mObject2.spectrogram(:,min(iFloor+1,nAxis2))-mObject2.spectrogram(:,min(iFloor,nAxis2)));\n            sgram2on2faxis = mObject2.spectrogram(:,min(iFloor,nAxis2))+dSgram;\n            sgram2on1faxis = sgram2on2faxis(fIndex);\n            tmp = (1-mixRate.spectrum)*log(mObject1.spectrogram(:,ii))+mixRate.spectrum*sgram2on1faxis;\n            morphedSgram(:,ii) = exp(tmp);\n    end;\n    if mObject1.F0(ii)>0\n        morphedF0(ii) = (1-mixRate.F0)*log(mObject1.F0(ii));\n        weightSumF0(ii) = (1-mixRate.F0);\n    end;\n    if (mObject2.F0(iFloor)>0) & (mObject2.F0(min(iFloor+1,nAxis2))>0)\n        dF0 = iFraction*(log(mObject2.F0(min(iFloor+1,nAxis2)))-log(mObject2.F0(min(iFloor,nAxis2))));\n        morphedF0(ii) = mixRate.F0*(log(mObject2.F0(min(iFloor,nAxis2)))+dF0)+morphedF0(ii);\n        weightSumF0(ii) = weightSumF0(ii)+mixRate.F0;\n    end;\n    morphedvuv(ii) = ((mObject1.vuv(ii)*abs(1-mixRate.F0)+abs(mixRate.F0)*mObject2.vuv(min(iFloor,nAxis2)))>0);\nend;\nmorphedF0(weightSumF0>0) = exp(morphedF0(weightSumF0>0)./weightSumF0(weightSumF0>0));\n\n%----- mapping back onto morphed time axis\ntimeAnchorMorph = (1-mixRate.timeCoordinate)*timeAnchor1 + mixRate.timeCoordinate*timeAnchor2;\nlocationOnMorph = (0:(timeAnchorMorph(end)/dtFrame))*dtFrame;\nmapFormMorphTo1 = interp1(timeAnchorMorph,timeAnchor1,locationOnMorph);\nnAxisMorph = length(locationOnMorph);\nmorphedApOnMorph = zeros(nr1,nAxisMorph);\nmorphedSgramOnMorph = zeros(nr1,nAxisMorph);\nmorphedF0onMorph = zeros(nAxisMorph,1);\nmorphedVUVonMorph = zeros(nAxisMorph,1);\n%----- set place holders\nmObject3.samplingFrequency = fs;\nmObject3.F0 = morphedF0onMorph;\nmObject3.vuv = morphedVUVonMorph;\nmObject3.aperiodicityIndex = morphedApOnMorph;\nmObject3.spectrogram = morphedSgramOnMorph;\nmObject3.anchorTimeLocation = timeAnchorMorph(2:end-1);\nmObject3.anchorFrequency = (1-mixRate.freqCoordinate)*mObject1.anchorFrequency+mixRate.freqCoordinate*mObject2.anchorFrequency;\n%------ nitialize frequency mapping function\nfmapFromMorphto1OnTimeMorph = generateFrequencyMap(mObject3,mObject1);\nfor ii=1:nAxisMorph\n    mappedIndexOn1 = mapFormMorphTo1(ii)/dtFrame+1;\n    iFloor = floor(mappedIndexOn1);\n    iFraction = mappedIndexOn1-iFloor;\n    fIndex = floor(fmapFromMorphto1OnTimeMorph(:,ii)/fs*2*(nr1-1))+1;\n    morphedApOnMorph(:,ii) = morphedAp(fIndex,iFloor) ...\n        +iFraction*(morphedAp(fIndex,min(iFloor+1,nAxis1))-morphedAp(fIndex,iFloor));\n    morphedSgramOnMorph(:,ii) = morphedSgram(fIndex,iFloor) ...\n        +iFraction*(morphedSgram(fIndex,min(iFloor+1,nAxis1))-morphedSgram(fIndex,iFloor));\n    if (morphedF0(iFloor)>0) & (morphedF0(min(iFloor+1,nAxis1))>0)\n        dF0 = iFraction*(morphedF0(min(iFloor+1,nAxis1))-morphedF0(iFloor));\n        morphedF0onMorph(ii) = morphedF0(iFloor)+dF0;\n    end;\n    morphedVUVonMorph(ii) = morphedvuv(iFloor);\nend;\nmObject3.F0 = morphedF0onMorph; \nmObject3.vuv = morphedVUVonMorph;\nmObject3.aperiodicityIndex = morphedApOnMorph;\nmObject3.spectrogram = morphedSgramOnMorph;\nmObject3.anchorTimeLocation = timeAnchorMorph(2:end-1);\n%mObject3.anchorFrequency = (1-mRate)*mObject1.anchorFrequency+mRate*mObject2.anchorFrequency;\n%mObject3 = fmapFromMorphto1OnTimeMorph; % This line is a dummy.\nreturn;\n\n%%% ------ Internal function to check for object's similarity\nfunction mObject3 = checkForSimilarity(mObject1,mObject2)\nmObject3 = [];\nif mObject1.samplingFrequency ~= mObject2.samplingFrequency;mObject3 = [];return;end;\nif mObject1.frameUpdateInterval ~= mObject2.frameUpdateInterval;mObject3 = [];return;end;\nif length(mObject1.anchorTimeLocation) ~= length(mObject2.anchorTimeLocation);mObject3 = [];return;end;\nnAnchor = length(mObject1.anchorTimeLocation);\nfor ii=1:nAnchor % check for similarity of anchor structure\n    frequencyAnchor1 = mObject1.anchorFrequency(ii,:)';% 01/Oct./2005 by HK\n    frequencyAnchor2 = mObject2.anchorFrequency(ii,:)';% 01/Oct./2005 by HK\n    if (sum(frequencyAnchor1>0) ~= sum(frequencyAnchor2>0)) | ...\n            (sum(frequencyAnchor1<0) ~= sum(frequencyAnchor2<0))\n        display('Warning!! Object structures are inconsistent!'); % 01/Oct./2005 by HK\n        return;\n    end;\nend;\nmObject3 = createMobject;\nm0bject3.samplingFrequency = mObject1.samplingFrequency;\nm0bject3.frameUpdateInterval = mObject1.frameUpdateInterval;\nreturn;\n\n%%%--------\nfunction mixRate = checkForMorphingConditions(mRate);\n%   04/Oct./2005 added by HK\n\nif ~isstruct(mRate)\n    mixRate.F0 = mRate;\n    mixRate.spectrum = mRate;\n    mixRate.aperiodicity = mRate;\n    mixRate.timeCoordinate = mRate;\n    mixRate.freqCoordinate = mRate;\n    return;\nend;\nmixRate.F0 = mRate.F0;\nmixRate.spectrum = mRate.spectrum;\nmixRate.aperiodicity = mRate.aperiodicity;\nmixRate.timeCoordinate = mRate.timeCoordinate;\nmixRate.freqCoordinate = mRate.freqCoordinate;\nreturn;\n\n%%%--------\nfunction fmapFrom1to2OnTime1 = generateFrequencyMap(mObject1,mObject2);\n\ndtFrame = mObject1.frameUpdateInterval;\nendLocation1 = (length(mObject1.F0)-1)*dtFrame; % in ms\ntimeAnchor1 = [0;mObject1.anchorTimeLocation;endLocation1];\nlocationOn1 = (0:length(mObject1.F0)-1)*dtFrame;\nfs = mObject1.samplingFrequency;\n[nr1,nc1] = size(mObject1.spectrogram);\nnAnchor = length(mObject1.anchorTimeLocation);\nfmapFrom1to2 = zeros(nr1,nAnchor);\nfrequencyAxis = (0:nr1-1)'/(nr1-1)*fs/2;\nnumberOfFrequencyAnchors = zeros(nAnchor,1);\nfor ii=1:nAnchor\n    frequencyAnchor1 = mObject1.anchorFrequency(ii,:)';\n    frequencyAnchor1 = [0;frequencyAnchor1(frequencyAnchor1>0);fs/2];\n    numberOfFrequencyAnchors(ii) = length(frequencyAnchor1(frequencyAnchor1>0));\n    frequencyAnchor2 = mObject2.anchorFrequency(ii,:)';\n    frequencyAnchor2 = [0;frequencyAnchor2(frequencyAnchor2>0);fs/2];\n    fmapFrom1to2(:,ii) = interp1(frequencyAnchor1,frequencyAnchor2,frequencyAxis);\nend;\nfor ii=1:nAnchor\n    if numberOfFrequencyAnchors(ii) == 1\n        if numberOfFrequencyAnchors(min(ii+1,nAnchor)) > 1\n            fmapFrom1to2(:,ii) = fmapFrom1to2(:,min(ii+1,nAnchor));\n        elseif numberOfFrequencyAnchors(max(ii-1,1)) > 1\n            fmapFrom1to2(:,ii) = fmapFrom1to2(:,max(ii-1,1));\n        end;\n    end;\nend;\nfmapFrom1to2 = [fmapFrom1to2(:,1) fmapFrom1to2 fmapFrom1to2(:,nAnchor)];\nfmapFrom1to2OnTime1 = interp1(timeAnchor1,fmapFrom1to2',locationOn1)';\nreturn;\n\n%%%-------\nfunction cleanedUpObject = checkForIntegrity(inputObject);\n\nmaximumIndex = max([length(inputObject.F0), ...\n    size(inputObject.spectrogram,2) ...\n    size(inputObject.aperiodicityIndex,2)]);\nif length(inputObject.F0) < maximumIndex\n    inputObject.F0 = [inputObject.F0(:);inputObject.F0(end)*ones(maximumIndex - length(inputObject.F0),1)];\nend;\nif size(inputObject.spectrogram,2) < maximumIndex\n    numberOfFillIn = maximumIndex-size(inputObject.spectrogram,2);\n    inputObject.spectrogram = [inputObject.spectrogram inputObject.spectrogram(:,end)*ones(1,numberOfFillIn)];\nend;\nif size(inputObject.aperiodicityIndex,2) < maximumIndex\n    numberOfFillIn = maximumIndex-size(inputObject.aperiodicityIndex,2);\n    inputObject.aperiodicityIndex = [inputObject.aperiodicityIndex inputObject.aperiodicityIndex(:,end)*ones(1,numberOfFillIn)];\nend;\ncleanedUpObject = inputObject;\n\n"
  },
  {
    "path": "morphing_src/updateFieldOfMobject.m",
    "content": "function mObject = updateFieldOfMobject(mObject,fieldName,fieldValue)\n\nif isfield(mObject,fieldName)\n    mObject = setfield(mObject,fieldName,fieldValue);\nelse\n    disp([fieldName ' is not in a Mobject.']);\nend;\n    \n    "
  },
  {
    "path": "morphing_src/waveformMorphing.m",
    "content": "function mObject3 = waveformMorphing(mObject1,mObject2,mRate);\n%   Morphing with minimum information\n%   (Actually this is not real morphing.\n%   It is simply blending two waveform.)\n%   mObject3 = waveformMorphing(mObject1,mObject2,mRate);\n\n%   Designed and coded by Hideki Kawahara\n%   27/Feb./2005\n%   Copyright(c) 2005, Hideki Kawahara\n\nnLength = max(length(mObject1.waveform),length(mObject2.waveform));\nif mObject1.samplingFrequency ~= mObject2.samplingFrequency\n    mObject3 = [];\n    return\nend;\nx = zeros(nLength,1);\nx(1:length(mObject1.waveform)) = (1-mRate)*mObject1.waveform;\nx(1:length(mObject2.waveform)) = mRate*mObject2.waveform + x(1:length(mObject2.waveform));\n\nmObject3=createMobject;\nmObject3.waveform = x;\nmObject3.samplingFrequency = mObject1.samplingFrequency;\n"
  },
  {
    "path": "src/CheckAnalysisData.m",
    "content": "function output = ...\n  CheckAnalysisData(f0raw, ap, n3sgram, target_analysis_dir, tmp_name_root)\noutput = true;\ntolerance = 10 ^ (-6);\nf0_file_path = ...\n  [target_analysis_dir tmp_name_root 'f0.bin'];\nap_file_path = ...\n  [target_analysis_dir tmp_name_root 'ap.bin'];\nsp_file_path = ...\n  [target_analysis_dir tmp_name_root 'sp.bin'];\nf0_ref = ReadBinaryData(f0_file_path);\nap_ref = ReadBinaryData(ap_file_path);\nsp_ref = ReadBinaryData(sp_file_path);\nf0_median = median(f0_ref(f0_ref > 30 & f0_ref < 1000));\nap_std = std(ap_ref(:));\nsp_std = std(sp_ref(:));\nif std(f0raw(:) - f0_ref(:)) / f0_median > tolerance\n  return;\nend;\nif std(ap(:) - ap_ref(:)) / ap_std > tolerance\n  return;\nend;\nif std(n3sgram(:) - sp_ref(:)) / sp_std > tolerance\n  return;\nend;\nend"
  },
  {
    "path": "src/HzToErbRate.m",
    "content": "function y=HzToErbRate(x)\n% by Matrin Cooke, adopted from MAD library\n\ny=(21.4*log10(4.37e-3*x+1));\n"
  },
  {
    "path": "src/MulticueF0v14.m",
    "content": "function [f0raw,vuv,auxouts,prm]=MulticueF0v14(x,fs,f0floor,f0ceil)\n%   Source information extraction using multiple cues\n%   Default values are used when other arguments are missing.\n%   You can modify specific parameters by assigning them.\n%   The control parameters open to user in this version are\n%   F0 search range.\n%   Examples:\n%   f0=MulticueF0v14(x,fs);\n%       x: input signal (monaural signal)\n%       fs: sampling frequency (Hz)\n%       f0: fundamental frequency (Hz)\n%           f0 is set to zero when unvoiced.\n%   f0=MulticueF0v14(x,fs,f0floor,f0ceil)\n%       f0floor: Lower limit of F0 search (Hz)\n%       f0ceil: Upper limit of F0 search (Hz)\n%   [f0raw,vuv,auxouts]=MulticueF0v14(x,fs,f0floor,f0ceil)\n%       f0raw: fundamental frequency without V/UV information\n%       vuv: V/UV indicator, 1:voiced, 0: unvoiced\n%       auxouts: base information for f0 extraction (structure variable)\n%\n%   [f0raw,vuv,auxouts,prmouts]=MulticueF0v14(x,fs,prmin)\n%       prmin: structure variable for control parameters\n%       f0raw: fundamental frequency without V/UV information\n%       vuv: V/UV indicator, 1:voiced, 0: unvoiced\n%       auxouts: base information for f0 extraction (structure variable)\n%       prmouts: structure variable showing used control parameters\n%\n%   Copyright(c) Wakayama University, 2004\n%   This version is very experimental. No warranty.\n%   Please contact: kawahara@sys.wakayama-u.ac.jp\n\n%   Designed and coded by Hideki Kawahara\n%   31/August/2004 first conceiled version\n%   30/June/2016 refactored for Octave compatibility\n\nswitch nargin\n    case {2,4}\n    case 3\n        if ~isstruct(f0floor)\n            displayusage;\n            f0raw=[];vuv=[];\n            return;\n        else\n            prmin = f0floor;\n        end;\n    otherwise\n        displayusage;\n        f0raw=[];vuv=[];\n        return;\nend\nswitch nargin\n    case 3\n    case 4\n        prmin.F0searchLowerBound=f0floor;\n        prmin.F0searchUpperBound=f0ceil;\n        prmin.DisplayPlots=0;\n    otherwise\n        prmin.DisplayPlots=0;\nend;\n[f0raw,vuv,auxouts,prm]=SourceInfobyMultiCues050111(x,fs,prmin);\nnn=min(length(vuv),length(f0raw));\nf0raw=f0raw(1:nn)';\nvuv=vuv(1:nn)';\nswitch nargout\n    case 1\n        f0raw=f0raw.*vuv;\n    case {3,4}\n    otherwise\n        displayusage;\n        return;\nend;\nend\n\nfunction displayusage\nfprintf('   Source information extraction using multiple cues\\n');\nfprintf('   Default values are used when other arguments are missing.\\n');\nfprintf('   You can modify specific parameters by assigning them.\\n');\nfprintf('   The control parameters open to user in this version are\\n');\nfprintf('   F0 search range.\\n');\nfprintf('   Example:1\\n');\nfprintf('   f0=MulticueF0v14(x,fs);\\n');\nfprintf('       x: input signal (monaural signal)\\n');\nfprintf('       fs: sampling frequency (Hz)\\n');\nfprintf('       f0: fundamental frequency (Hz)\\n');\nfprintf('           f0 is set to zero when unvoiced.\\n');\nfprintf('   f0=MulticueF0v14(x,fs,f0floor,f0ceil)\\n');\nfprintf('       f0floor: Lower limit of F0 search (Hz)\\n');\nfprintf('       f0ceil: Upper limit of F0 search (Hz)\\n');\nfprintf('   [f0raw,vuv,auxouts]=MulticueF0v14(x,fs,f0floor,f0ceil)\\n');\nfprintf('       f0raw: fundamental frequency without V/UV information\\n');\nfprintf('       vuv: V/UV indicator, 1:voiced, 0: unvoiced\\n');\nfprintf('       auxouts: base information for f0 extraction (structure variable)\\n');\nfprintf('   [f0raw,vuv,auxouts,prmouts]=MulticueF0v14(x,fs,prmin)\\n');\nfprintf('       prmin: structure variable for control parameters\\n');\nfprintf('       f0raw: fundamental frequency without V/UV information\\n');\nfprintf('       vuv: V/UV indicator, 1:voiced, 0: unvoiced\\n');\nfprintf('       auxouts: base information for f0 extraction (structure variable)\\n');\nfprintf('       prmouts: structure variable showing used control parameters\\n');\nfprintf('\\n');\nfprintf('   Copyright(c) Wakayama University, 2004,2005\\n');\nfprintf('   This version is very experimental. No warranty.\\n');\nfprintf('   Please contact: kawahara@sys.wakayama-u.ac.jp\\n');\nend\n\nfunction [f0raw,vuv,auxouts,prm]=SourceInfobyMultiCues050111(x,fs,prmin)\n% Source information extraction function\n%   with combined source information\n%   minimum requisite is to provide x and fs and receive f0.\n%   Default values are used when other arguments are missing.\n%   You can modify specific parameters by assigning using prmin.\n%   Example:1\n%   SourceInfobyMultiCues050111(x,fs);\n%       Simplest usage\n%   Example:2\n%   f0raw=SourceInfobyMultiCues050111(x,fs); \n%       F0 for voiced segment is what you get.\n%   Example:3\n%   [f0raw,vuv,auxouts,prm]=SourceInfobyMultiCues050111(x,fs);\n%       You can check what defaults were and raw information.\n%   Example:4\n%   [f0raw,vuv,auxouts,prm]=SourceInfobyMultiCues050111(x,fs,prmin);\n%       You have full control (and responsibility).\n\n% Designed and coded by Hideki Kawahara\n%   24/June/2004\n\n% Assuming x consists of data\n% Assuming fs consists of sampling frequency (Hz)\n\n%------ check input arguments\nprm=zsetdefaultparams;\n\nswitch nargin\n    case {2,3}\n    otherwise\n        help SourceInfobyMultiCues040701\n        f0raw=[];vuv=[];\n        return;\nend\n[nn,mm]=size(x);\nif min(nn,mm)>1\n    display('Using only the first channel.');\n    if nn<mm\n        x=x(1,:);\n    else\n        x=x(:,1);\n    end;\nend;\nx=x(:); % make sure x is a column vector.\n\n%--- safe guard for all zero segments 12/Jan./2005\nl1ms=round(fs/1000);\nif length(x(x==0))>l1ms  % bug fix 16/Aug./2008\n    zv=randn(size(x(x==0)));\n    zv=cumsum(zv-mean(zv));\n    zv=zv/std(zv)*std(x)/10000;\n    x(x==0)=zv;\nend;\n\n%------ set initial parameters\nif nargin==3\n    if isfield(prmin,'F0searchLowerBound')==1;\n        prm.F0searchLowerBound=prmin.F0searchLowerBound;end;\n    if isfield(prmin,'F0searchUpperBound')==1;\n        prm.F0searchUpperBound=prmin.F0searchUpperBound;end;\n    if isfield(prmin,'F0frameUpdateInterval')==1;\n        prm.F0frameUpdateInterval=prmin.F0frameUpdateInterval;end;\n    if isfield(prmin,'NofChannelsInOctave')==1;\n        prm.NofChannelsInOctave=prmin.NofChannelsInOctave;end;\n    if isfield(prmin,'IFWindowStretch')==1;\n        prm.IFWindowStretch=prmin.IFWindowStretch;end;\n    if isfield(prmin,'DisplayPlots')==1;\n        prm.DisplayPlots=prmin.DisplayPlots;end;\n    if isfield(prmin,'IFsmoothingLengthRelToFc')==1;\n        prm.IFsmoothingLengthRelToFc=prmin.IFsmoothingLengthRelToFc;end;\n    if isfield(prmin,'IFminimumSmoothingLength')==1;\n        prm.IFminimumSmoothingLength=prmin.IFminimumSmoothingLength;end;\n    if isfield(prmin,'IFexponentForNonlinearSum')==1;\n        prm.IFexponentForNonlinearSum=prmin.IFexponentForNonlinearSum;end;\n    if isfield(prmin,'IFnumberOfHarmonicForInitialEstimate')==1;\n        prm.IFnumberOfHarmonicForInitialEstimate=prmin.IFnumberOfHarmonicForInitialEstimate;end;\n    if isfield(prmin,'TimeConstantForPowerCalculation')==1;\n        prm.TimeConstantForPowerCalculation=prmin.TimeConstantForPowerCalculation;end;\n    if isfield(prmin,'ACtimeWindowLength')==1;\n        prm.ACtimeWindowLength=prmin.ACtimeWindowLength;end;\n    if isfield(prmin,'ACnumberOfFrequencySegments')==1;\n        prm.ACnumberOfFrequencySegments=prmin.ACnumberOfFrequencySegments;end;\n    if isfield(prmin,'ACfrequencyDomainWindowWidth')==1;\n        prm.ACfrequencyDomainWindowWidth=prmin.ACfrequencyDomainWindowWidth;end;\n    if isfield(prmin,'ACpowerExponentForNonlinearity')==1;\n        prm.ACpowerExponentForNonlinearity=prmin.ACpowerExponentForNonlinearity;end;\n    if isfield(prmin,'ACamplitudeCompensationInShortLag')==1;\n        prm.ACamplitudeCompensationInShortLag=prmin.ACamplitudeCompensationInShortLag;end;\n    if isfield(prmin,'ACexponentForACdistance')==1;\n        prm.ACexponentForACdistance=prmin.ACexponentForACdistance;end;\n    if isfield(prmin,'AClagSmoothingLength')==1;\n        prm.AClagSmoothingLength=prmin.AClagSmoothingLength;end;\n    if isfield(prmin,'ACtemporalSmoothingLength')==1;\n        prm.ACtemporalSmoothingLength=prmin.ACtemporalSmoothingLength;end;\n    if isfield(prmin,'ThresholdForSilence')==1;\n        prm.ThresholdForSilence=prmin.ThresholdForSilence;end;\n    if isfield(prmin,'ThresholdForVUV')==1;\n        prm.ThresholdForVUV=prmin.ThresholdForVUV;end;\n    if isfield(prmin,'WeightForAutocorrelationMap')==1;\n        prm.WeightForAutocorrelationMap=prmin.WeightForAutocorrelationMap;end;\n    if isfield(prmin,'WeightForInstantaneousFqMap')==1;\n        prm.WeightForInstantaneousFqMap=prmin.WeightForInstantaneousFqMap;end;\n    if isfield(prmin,'VUVthresholdOfAC1')==1;\n        prm.VUVthresholdOfAC1=prmin.VUVthresholdOfAC1;end;\n    if isfield(prmin,'SDforNormalizeMixingDistance')==1;\n        prm.SDforNormalizeMixingDistance=prmin.SDforNormalizeMixingDistance;end;\n    if isfield(prmin,'SDforTrackingNormalization')==1;\n        prm.SDforTrackingNormalization=prmin.SDforTrackingNormalization;end;\n    if isfield(prmin,'MaxumumPermissibleOctaveJump')==1;\n        prm.MaxumumPermissibleOctaveJump=prmin.MaxumumPermissibleOctaveJump;end;\n    if isfield(prmin,'ThresholdToStartSearch')==1;\n        prm.ThresholdToStartSearch=prmin.ThresholdToStartSearch;end;\n    if isfield(prmin,'ThresholdToQuitSearch')==1;\n        prm.ThresholdToQuitSearch=prmin.ThresholdToQuitSearch;end;\n    if isfield(prmin,'ThresholdForReliableRegion')==1;\n        prm.ThresholdForReliableRegion=prmin.ThresholdForReliableRegion;end;\nend;\n    \n%----- copy modified analysis conditions to internal variables\nf0floor=prm.F0searchLowerBound; % f0floor\nf0ceil=prm.F0searchUpperBound; % f0ceil\nshiftm=prm.F0frameUpdateInterval; %  % F0 calculation interval (ms)\nnvo=prm.NofChannelsInOctave; % nvo=24; % Number of channels in one octave\nmu=prm.IFWindowStretch; % mu=1.2; % window stretch from isometric window\nimgi=prm.DisplayPlots; % imgi=1; % image display indicator (1: display image)\nsmp=prm.IFsmoothingLengthRelToFc; %  smp=1; % smoothing length relative to fc (ratio)\nminm=prm.IFminimumSmoothingLength; %  minm=5; % minimum smoothing length (ms)\npcIF=prm.IFexponentForNonlinearSum; % pc=0.5; % exponent to represent nonlinear summation\nncIF=prm.IFnumberOfHarmonicForInitialEstimate; % nc=1; % number of harmonic component to use (1,2,3)\ntcpower=prm.TimeConstantForPowerCalculation;  % tcpower=10; % time constant for power calculation (ms)\nwtlm=prm.ACtimeWindowLength; % Time window length for Autocorrelation based method (ms)\nndiv=prm.ACnumberOfFrequencySegments; % for Autocorrelation method\nwflf=prm.ACfrequencyDomainWindowWidth; % for Autocorrelation method (Hz)\npcAC=prm.ACpowerExponentForNonlinearity; % for Autocorrelation method\nampAC=prm.ACamplitudeCompensationInShortLag; % for Autocorrelation method (ratio)\nbetaAC=prm.ACexponentForACdistance; % Nonlinear distance measure for post processing\nlagslAC=prm.AClagSmoothingLength; % Lag smoothing length for post processing (s) !!\ntimeslAC=prm.ACtemporalSmoothingLength; % Temporal smoothing length for post processing (ms)\nwAC=prm.WeightForAutocorrelationMap; % weight for combining maps (Autocorrelation)\nwIF=prm.WeightForInstantaneousFqMap; % weight for combining maps (Instantaneous Frequency)\nmixsd=prm.SDforNormalizeMixingDistance; % Normalization factor for mixing F0 distance (octave)\n\nnvc=ceil(log(f0ceil/f0floor)/log(2)*nvo); ...\n    % Number of channels in whole search range\n\n%------- extract fixed points of frequency to instantaneous frequency map\n[f0v,vrv,~,~,~]= ...\n    zfixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pcIF,ncIF);\n[~,pos]=zmultiCandIF(f0v,vrv);\n[y,ind,~]=zremoveACinduction(x,fs,pos);\n%------- Pre processing of AC induction if necessary\nif ind==1\n    x=y;\n    [f0v,vrv,~,~,~]= ...\n        zfixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pcIF,ncIF);\nend;\n\n%---- selecting multiple F0 candidates based on IF\n[val,pos]=zmultiCandIF(f0v,vrv);\nif imgi==1\n    hh=figure;semilogy(pos,'+');grid on;hold on;\n    set(gca,'fontsize',16);\n    axis([0 length(x)/fs*1000 f0floor f0ceil]);\nend;\n%---- selecting multiple F0 candidates based on modified Autocorrelation\ndn=max(1,floor(fs/max(8000,3*2*f0ceil)));\nif imgi==1;\n    h1=figure;\nelse\n    h1=-1;\nend;\n[lagspec,lx]= ...\n    zlagspectestnormal(decimate(x,dn),fs/dn,shiftm,length(x)/fs*1000,shiftm,wtlm,ndiv,wflf,pcAC,ampAC,h1);\n[f02,pl2]=zmultiCandAC(lx,lagspec,betaAC,lagslAC,timeslAC);\nif imgi==1\n    figure(hh);semilogy(f02,'o');hold off\n    xlabel('time (ms)');ylabel('frequency (Hz)');\n    title('F0 candidates: o:autocorrelation  +:instantaneous frequency')\nend;\n\n%----- Combine multiple source information with dynamic range normalization\nauxouts.F0candidatesByIF=pos;\nauxouts.CNofcandidatesByIF=val;\nauxouts.F0candidatesByAC=f02;\nauxouts.ACofcandidatesByAC=pl2;\n[f0cand,relv]=zcombineRanking4(auxouts,mixsd,wAC,wIF,prm); % New mixing routine\nif imgi==1\n    figure\n    semilogy(f0cand,'+');grid on;\n    set(gca,'fontsize',16);\n    axis([0 length(f0cand) f0floor f0ceil]);\n    title('F0 candidates by mixed source information');\n    xlabel('time (ms)')\n    ylabel('frequency (Hz)')\nend;\n%----- Calculate power envelope\npws=zVpowercalc(x,fs,tcpower,shiftm,2000);\npwsdb=10*log10(abs(pws)+0.00000000001);\nmxpwsdb=max(pwsdb);\n[hstgrm,binlvl]=hist(pwsdb,mxpwsdb+(-60:2));\nq10=interp1(cumsum(hstgrm+0.000000001)/sum(hstgrm)*100,binlvl,10); % 10% quantile level\n[~,minid]=min(abs(q10-binlvl));\nbb=max(1,min(length(binlvl),minid+(-5:5))); % search range 10 dB % safeguard\nnoiselevel=sum(hstgrm(bb).*binlvl(bb))/sum(hstgrm(bb)); \nif imgi==1\n    figure\n    plot(pwsdb);grid on;\n    set(gca,'fontsize',16);\n    axis([0 length(pwsdb) noiselevel-10 max(pwsdb)]);\n    hold on;\n    plot([0 length(pwsdb)],noiselevel*[1 1],'r');\n    plot([0 length(pwsdb)],noiselevel*[1 1]+3,'r-.');\n    title('Instantaneous power  solid line:noise level, dash-dot line:threshold')\n    xlabel('time (ms)');ylabel('power (dB)')\nend;\n%----- F0 tracking\nac1=zeros(1,length(f0cand));\nfor ii=1:length(f0cand)\nac1(ii)=zfirstac(x,fs,round(ii/1000*fs),30);\nend;\nauxouts.F0candidatesByMix=f0cand;\nauxouts.RELofcandidatesByMix=relv;\nauxouts.FirstAutoCorrelation=ac1;\nauxouts.InstantaneousPower=pwsdb;\n[f0s,rels,csegs]=zcontiguousSegment10(auxouts,prm);\n[f0raw0,~]=zfillf0gaps6(auxouts,f0s,rels,csegs,prm);\nif imgi==1;\n    figure\n    semilogy(f0raw0,'c');grid on;\n    set(gca,'fontsize',16);\n    axis([0 length(f0raw0) f0floor f0ceil]);\n    drawnow;\nend;\n%------ F0 refinement using first three harmonic components\nf0raw0(isnan(f0raw0))=zeros(size(f0raw0(isnan(f0raw0))));\nf0raw0(f0raw0>f0ceil)=f0raw0(f0raw0>f0ceil)*0+f0ceil;\nf0raw0((f0raw0<f0floor)&(f0raw0>0))=f0raw0((f0raw0<f0floor)&(f0raw0>0))*0+f0floor;\n[f0raw2,ecr,ac1]=zrefineF06m(decimate(x,dn),fs/dn,f0raw0,1024,1.1,3,1,1,length(f0raw0));\nif imgi==1;\n    hold on;\n    semilogy(f0raw2,'g');grid on;\nend;\n%----- new V/UV decision routine 15/Aug./2004\nauxouts.BackgroundNoiselevel=noiselevel;\nvuv=zvuvdecision4(f0raw2,auxouts);\nnnll=min(length(f0raw2),length(vuv));\nf0raw3=f0raw2(1:nnll).*vuv(1:nnll);\nif imgi==1\n    semilogy(f0raw3,'k');hold off\n    title('F0 estimates,  cyan:initial, greeen:fine-tuned, black:voiced part')\n    xlabel('time (ms)');ylabel('frequency (Hz)');\nend;\nf0raw=f0raw2(1:nnll);vuv=vuv(1:nnll);\nauxouts.F0candidatesByIF=pos;\nauxouts.CNofcandidatesByIF=val;\nauxouts.F0candidatesByAC=f02;\nauxouts.ACofcandidatesByAC=pl2;\nauxouts.F0candidatesByMix=f0cand;\nauxouts.RELofcandidatesByMix=relv;\nauxouts.RefinedCN=ecr;\nauxouts.FirstAutoCorrelation=ac1;\nauxouts.F0initialEstimate=f0raw0;\nauxouts.BackgroundNoiselevel=noiselevel;\nauxouts.InstantaneousPower=pwsdb;\nauxouts.RefinedF0estimates=f0raw;\nauxouts.VUVindicator=vuv;\nif imgi==1; displaysummary(auxouts,f0floor,f0ceil); end;\nswitch nargout\n    case 0\n        f0raw=auxouts;eval(['help ' mfilename]);\n    case 1\n        f0raw=f0raw3;\n    case 2\n    case {3,4}\n    otherwise\n        eval(['help ' mfilename]);\n        return;\nend;\nend\n\n%------\nfunction prm=zsetdefaultparams\nprm.F0searchLowerBound=40; % f0floor\nprm.F0searchUpperBound=800; % f0ceil\nprm.F0frameUpdateInterval=1; % shiftm % F0 calculation interval (ms)\nprm.NofChannelsInOctave=24; % nvo=24; % Number of channels in one octave\nprm.IFWindowStretch=1.2; % mu=1.2; % window stretch from isometric window\nprm.DisplayPlots=0; % imgi=1; % image display indicator (1: display image)\nprm.IFsmoothingLengthRelToFc=1; %  smp=1; % smoothing length relative to fc (ratio)\nprm.IFminimumSmoothingLength=5; %  minm=5; % minimum smoothing length (ms)\nprm.IFexponentForNonlinearSum=0.5; % pc=0.5; % exponent to represent nonlinear summation\nprm.IFnumberOfHarmonicForInitialEstimate=1; % nc=1; % number of harmonic component to use (1,2,3)\nprm.TimeConstantForPowerCalculation=10;  % tcpower=10; % time constant for power calculation (ms)\nprm.ACtimeWindowLength=60; % Time window length for Autocorrelation based method (ms)\nprm.ACnumberOfFrequencySegments=8; % for Autocorrelation method\nprm.ACfrequencyDomainWindowWidth=2200; % for Autocorrelation method (Hz)\nprm.ACpowerExponentForNonlinearity=0.5; % for Autocorrelation method\nprm.ACamplitudeCompensationInShortLag=1.6; %2.2; % for Autocorrelation method (ratio) 23/July/2004\nprm.ACexponentForACdistance=4; % Nonlinear distance measure for post processing\nprm.AClagSmoothingLength=0.0001; % Lag smoothing length for post processing (s) !! 0.01 to 0.0001 23/July/2004\nprm.ACtemporalSmoothingLength=20; % Temporal smoothing length for post processing (ms)\nprm.ThresholdForSilence=3; % for silence decision above average noise level (dB)\nprm.ThresholdForVUV=0.6; % for V/UV decision based on first autocorrelation and C/N\nprm.WeightForAutocorrelationMap=1; % weight for combining maps (Autocorrelation)\nprm.WeightForInstantaneousFqMap=1; % weight for combining maps (Instantaneous Frequency)\nprm.VUVthresholdOfAC1=-0.1; % First autocorrelation thershould for VUV in segment search\nprm.SDforNormalizeMixingDistance=0.3; % Normalization factor for mixing F0 distance (octave)\nprm.SDforTrackingNormalization=0.2;\nprm.MaxumumPermissibleOctaveJump=0.4; \nprm.ThresholdToStartSearch=0.3;\nprm.ThresholdToQuitSearch=0.35;\nprm.ThresholdForReliableRegion=0.25;\nprm.WhoAmI=mfilename;\nend\n\n%%%------------\nfunction oki=displaysummary(f,f0floor,f0ceil)\noki=1;\nnn=length(f.RefinedF0estimates);\nfigure\nsubplot(211);\nsemilogy(f.F0initialEstimate,'c');grid on;\nhold on;\nsemilogy(f.RefinedF0estimates.*f.VUVindicator,'b');grid on;\nset(gca,'fontsize',14);\nxlabel('time (ms)');\nylabel('frequency (Hz)');\naxis([1 nn f0floor f0ceil]);\nsubplot(212);\nplot(f.RELofcandidatesByMix,'.');grid on;\nset(gca,'fontsize',14);\nxlabel('time (ms)');\nylabel('relative periodicity');\naxis([1 nn 0 1]);\ndrawnow;\nend\n\n%%%------------\nfunction [f0v,vrv,dfv,nf,aav]=zfixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pc,nc)\n\n%\tFixed point analysis to extract F0\n%\t[f0v,vrv,dfv,nf]=fixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pc,nc)\n%\tx\t: input signal\n%\tfs\t: sampling frequency (Hz)\n%\tf0floor\t: lowest frequency for F0 search\n%\tnvc\t: total number of filter channels\n%\tnvo\t: number of channels per octave\n%\tmu\t: temporal stretching factor\n%\timgi\t: image display indicator (1: display image)\n%\tshiftm\t: frame shift in ms\n%\tsmp\t: smoothing length relative to fc (ratio)\n%\tminm\t: minimum smoothing length (ms)\n%\tpc\t: exponent to represent nonlinear summation\n%\tnc\t: number of harmonic component to use (1,2,3)\n\n%\tDesigned and coded by Hideki Kawahara\n%\t28/March/1999\n\nx=cleaninglownoise(x,fs,f0floor);\nfxx=f0floor*2.0.^((0:nvc-1)/nvo)';\nfxh=max(fxx);\ndn=max(1,floor(fs/(fxh*6.3)));\nif nc>2\n\tpm3=zmultanalytFineCSPB(decimate(x,dn),fs/dn,f0floor,nvc,nvo,mu,3); % error crrect 2002.9.19 (mu was fixed 1.1)\n\tpif3=zwvlt2ifq(pm3,fs/dn);\n\t[~,mm]=size(pif3);\n\tpif3=pif3(:,1:3:mm);\n\tpm3=pm3(:,1:3:mm);\nend;\n\nif nc>1\n\tpm2=zmultanalytFineCSPB(decimate(x,dn),fs/dn,f0floor,nvc,nvo,mu,2);% error crrect 2002.9.19(mu was fixed 1.1)\n\tpif2=zwvlt2ifq(pm2,fs/dn);\n\t[~,mm]=size(pif2);\n\tpif2=pif2(:,1:3:mm);\n\tpm2=pm2(:,1:3:mm);\nend;\n\npm1=zmultanalytFineCSPB(decimate(x,dn*3),fs/(dn*3),f0floor,nvc,nvo,mu,1);% error crrect 2002.9.19(mu was fixed 1.1)\n%%%% safe guard added on 15/Jan./2003\nmxpm1=max(max(abs(pm1)));\neeps=mxpm1/10000000;\npm1(pm1==0)=pm1(pm1==0)+eeps;\n%%%% safe guard end\npif1=zwvlt2ifq(pm1,fs/(dn*3));\n\n[~,mm1]=size(pif1);\nmm=mm1;\nif nc>1\n\t[~,mm2]=size(pif2);\n\tmm=min(mm1,mm2);\nend;\n\nif nc>2\n\t[~,mm3]=size(pif3);\n\tmm=min([mm1 mm2 mm3]);\nend;\n\nif nc == 2\n\tfor ii=1:mm\n\t\tpif2(:,ii)=(pif1(:,ii).*(abs(pm1(:,ii))).^pc ...\n\t\t\t+pif2(:,ii)/2.*(abs(pm2(:,ii))).^pc )...\n\t\t\t./((abs(pm1(:,ii))).^pc+(abs(pm2(:,ii))).^pc);\n\tend;\nend;\nif nc == 3 \n\tfor ii=1:mm\n\t\tpif2(:,ii)=(pif1(:,ii).*(abs(pm1(:,ii))).^pc ...\n\t\t\t+pif2(:,ii)/2.*(abs(pm2(:,ii))).^pc ...\n\t\t\t+pif3(:,ii)/3.*(abs(pm3(:,ii))).^pc )... \n\t\t\t./((abs(pm1(:,ii))).^pc+(abs(pm2(:,ii))).^pc+(abs(pm3(:,ii))).^pc);\n\tend;\nend;\nif nc == 1\n\tpif2=pif1;\nend;\n\npif2=pif2*2*pi;\ndn=dn*3;\n\n[slp,~]=zifq2gpm2(pif2,f0floor,nvo);\n[nn,mm]=size(pif2);\ndpif=(pif2(:,2:mm)-pif2(:,1:mm-1))*fs/dn;\ndpif(:,mm)=dpif(:,mm-1);\n[dslp,~]=zifq2gpm2(dpif,f0floor,nvo);\n\ndamp=(abs(pm1(:,2:mm))-abs(pm1(:,1:mm-1)))*fs/dn;\ndamp(:,mm)=damp(:,mm-1);\ndamp=damp./abs(pm1);\n\nfxx=f0floor*2.0.^((0:nn-1)/nvo)'*2*pi;\nmmp=0*dslp;\n[c1,c2b]=znrmlcf2(1);\nfor ii=1:nn\n\tc2=c2b*(fxx(ii)/2/pi)^2;\n\tcff=damp(ii,:)/fxx(ii)*2*pi*0;\n\tmmp(ii,:)=(dslp(ii,:)./(1+cff.^2)/sqrt(c2)).^2+(slp(ii,:)./sqrt(1+cff.^2)/sqrt(c1)).^2;\nend;\n\nif smp~=0\n\tsmap=zsmoothmapB(mmp,fs/dn,f0floor,nvo,smp,minm,0.4);\nelse\n\tsmap=mmp;\nend;\n\nfixpp=zeros(round(nn/3),mm);\nfixvv=fixpp+100000000;\nfixdf=fixpp+100000000;\nfixav=fixpp+1000000000;\nnf=zeros(1,mm);\nfor ii=1:mm\n\t[ff,vv,df,aa]=zfixpfreq3(fxx,pif2(:,ii),smap(:,ii),dpif(:,ii)/2/pi,pm1(:,ii));\n\tkk=length(ff);\n\tfixpp(1:kk,ii)=ff;\n\tfixvv(1:kk,ii)=vv;\n\tfixdf(1:kk,ii)=df;\n\tfixav(1:kk,ii)=aa;\n\tnf(ii)=kk;\nend;\nfixpp(fixpp==0)=fixpp(fixpp==0)+1000000;\n\nnp=max(nf);\nf0v=fixpp(1:np,round(1:shiftm/dn*fs/1000:mm))/2/pi;\nvrv=fixvv(1:np,round(1:shiftm/dn*fs/1000:mm));\ndfv=fixdf(1:np,round(1:shiftm/dn*fs/1000:mm));\naav=fixav(1:np,round(1:shiftm/dn*fs/1000:mm));\nnf=nf(round(1:shiftm/dn*fs/1000:mm));\nif imgi == 1;end;\nend\n\n%----------------------------------------------------------------\nfunction pif=zwvlt2ifq(pm,fs)\n%\tWavelet to instantaneous frequency map\n%\tfqv=wvlt2ifq(pm,fs)\n\n%\tCoded by Hideki Kawahara\n%\t02/March/1999\n\n[~,mm]=size(pm);\npm=pm./(abs(pm));\npif=abs(pm(:,:)-[pm(:,1),pm(:,1:mm-1)]);\npif=fs/pi*asin(pif/2);\npif(:,1)=pif(:,2);\nend\n\n%----------------------------------------------------------------\n\nfunction [slp,pbl]=zifq2gpm2(pif,f0floor,nvo)\n%\tInstantaneous frequency 2 geometric parameters\n%\t[slp,pbl]=ifq2gpm(pif,f0floor,nvo)\n%\tslp\t\t: first order coefficient\n%\tpbl\t\t: second order coefficient\n\n%\tCoded by Hideki Kawahara\n%\t02/March/1999\n\n[nn,~]=size(pif);\nfx=f0floor*2.0.^((0:nn-1)/nvo)*2*pi;\n\nc=2.0^(1/nvo);\ng=[1/c/c 1/c 1;1 1 1;c*c c 1];\nh=inv(g);\n\nslp=((pif(2:nn-1,:)-pif(1:nn-2,:))/(1-1/c) ...\n    +(pif(3:nn,:)-pif(2:nn-1,:))/(c-1))/2;\nslp=[slp(1,:);slp;slp(nn-2,:)];\n\npbl=pif(1:nn-2,:)*h(2,1)+pif(2:nn-1,:)*h(2,2)+pif(3:nn,:)*h(2,3);\npbl=[pbl(1,:);pbl;pbl(nn-2,:)];\n\nfor ii=1:nn\n\tslp(ii,:)=slp(ii,:)/fx(ii);\n\tpbl(ii,:)=pbl(ii,:)/fx(ii);\nend;\nend\n\n%------------------------------------------\n\nfunction p=zGcBs(x,k)\n\ntt=x+0.0000001;\np=tt.^k.*exp(-pi*tt.^2).*(sin(pi*tt+0.0001)./(pi*tt+0.0001)).^2;\nend\n\n%--------------------------------------------\nfunction smap=zsmoothmapB(map,fs,f0floor,nvo,mu,mlim,pex)\n\n[nvc,mm]=size(map);\nt0=1/f0floor;\nlmx=round(6*t0*fs*mu);\nwl=2^ceil(log(lmx)/log(2));\ngent=((1:wl)-wl/2)/fs;\n\nsmap=map;\nmpv=1;\nzt=0*gent;\niiv=1:mm;\nfor ii=1:nvc\n    t=gent*mpv; %t0*mu/mpv*1000\n    t=t(abs(t)<3.5*mu*t0);\n    wbias=round((length(t)-1)/2);\n    wd1=exp(-pi*(t/(t0*(1-pex))/mu).^2);\n    wd2=exp(-pi*(t/(t0*(1+pex))/mu).^2);\n    wd1=wd1/sum(wd1);\n    wd2=wd2/sum(wd2);\n    tm=fftfilt(wd1,[map(ii,:) zt]);\n    tm=fftfilt(wd2,[1.0./tm(iiv+wbias) zt]);\n    smap(ii,:)=1.0./tm(iiv+wbias);\n    if t0*mu/mpv*1000 > mlim\n        mpv=mpv*(2.0^(1/nvo));\n    end;\nend;\nend\n\n%--------------------------------------------\nfunction [ff,vv,df,aa]=zfixpfreq3(fxx,pif2,mmp,dfv,pm)\n\naav=abs(pm);\nnn=length(fxx);\niix=(1:nn)';\ncd1=pif2-fxx;\ncd2=[diff(cd1);cd1(nn)-cd1(nn-1)];\ncdd1=[cd1(2:nn);cd1(nn)];\nfp=(cd1.*cdd1<0).*(cd2<0);\nixx=iix(fp>0);\nff=pif2(ixx)+(pif2(ixx+1)-pif2(ixx)).*cd1(ixx)./(cd1(ixx)-cdd1(ixx));\nvv=mmp(ixx)+(mmp(ixx+1)-mmp(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\ndf=dfv(ixx)+(dfv(ixx+1)-dfv(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\naa=aav(ixx)+(aav(ixx+1)-aav(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\nend\n\n%--------------------------------------------\nfunction [c1,c2]=znrmlcf2(f)\n\nn=100;\nx=0:1/n:3;\ng=zGcBs(x,0);\ndg=[diff(g) 0]*n;\ndgs=dg/2/pi/f;\nxx=2*pi*f*x;\nc1=sum((xx.*dgs).^2)/n*2;\nc2=sum((xx.^2.*dgs).^2)/n*2;\nend\n\n%--------------------------------------------\nfunction x=cleaninglownoise(x,fs,f0floor)\n\nflm=50;\nflp=round(fs*flm/1000);\nnn=length(x);\nwlp=fir1(flp*2,f0floor/(fs/2));\nwlp(flp+1)=wlp(flp+1)-1;\nwlp=-wlp;\n\ntx=[x(:)' zeros(1,2*length(wlp))];\nttx=fftfilt(wlp,tx);\nx=ttx((1:nn)+flp);\n\nend\n\n%%%---------\nfunction pm=zmultanalytFineCSPB(x,fs,f0floor,nvc,nvo,mu,mlt)\n%       Dual waveleta analysis using cardinal spline manipulation\n%               pm=multanalytFineCSPB(x,fs,f0floor,nvc,nvo,mu,mlt)\n%       Input parameters \n%               \n%               x       : input signal (2kHz sampling rate is sufficient.)\n%               fs      : sampling frequency (Hz)\n%               f0floor : lower bound for pitch search (60Hz suggested)\n%               nvc     : number of total voices for wavelet analysis\n%               nvo     : number of voices in an octave\n%\t\t\t\tmu\t\t: temporal stretch factor\n%\t\t\t\tmlt\t\t: harmonic ID#\n%       Outpur parameters\n%               pm      : wavelet transform using iso-metric Gabor function\n%\n%       If you have any questions,  mailto:kawahara@hip.atr.co.jp\n%\n%       Copyright (c) ATR Human Information Processing Research Labs. 1996\n%       Invented and coded by Hideki Kawahara\n%       30/Oct./1996\n%       07/Dec./2002 waitbar was added\n\nt0=1/f0floor;\nlmx=round(6*t0*fs*mu);\nwl=2^ceil(log(lmx)/log(2));\nx=x(:)';\nnx=length(x);\ntx=[x,zeros(1,wl)];\ngent=((1:wl)-wl/2)/fs;\n\npm=zeros(nvc,nx);\nmpv=1;\nfor ii=1:nvc\n  tb=gent*mpv;\n  t=tb(abs(tb)<3.5*mu*t0);\n  wd1=exp(-pi*(t/t0/mu).^2);\n  wd2=max(0,1-abs(t/t0/mu));\n  wd2=wd2(wd2>0);\n  wwd=conv(wd2,wd1);\n  wwd=wwd(abs(wwd)>0.00001);\n  wbias=round((length(wwd)-1)/2);\n  wwd=wwd.*exp(1i*2*pi*mlt*t(round((1:length(wwd))-wbias+length(t)/2))/t0);\n  pmtmp1=fftfilt(wwd,tx);\n  pm(ii,:)=pmtmp1(wbias+1:wbias+nx)*sqrt(mpv);\n  mpv=mpv*(2.0^(1/nvo));\nend;\nend\n\n%%%-----\nfunction [val,pos]=zmultiCandIF(f0v,vrv)\n%   [val,pos]=multiCandIF(f0v,vrv)\n%   F0 candidates based on instantaneous frequency\n%   fixed points\n%   f0v : fixed point frequencies (Hz)\n%   vrv : fixed point N/C (ratio)\n\n%   by Hideki Kawahara\n%   23/June/2004\n\n[nr,nc]=size(f0v);\n[nr2,nc2]=size(vrv);\nif (nr~=nr2) || (nc~=nc2);val=[];pos=[];return;end;\nvrvdb=-zdBpower(vrv);\n\nmxfq=100000;\nval=zeros(nc,3);\npos=ones(nc,3);\nfor ii=1:nc\n    f=f0v(:,ii)';\n    v=vrvdb(:,ii)';\n    v=v(f<mxfq);\n    f=f(f<mxfq);\n    [~,mxp]=max(v);\n    if ~isempty(mxp)\n        pos(ii,1)=f(mxp);\n        val(ii,1)=v(mxp);\n    else\n        pos(ii,1)=1;\n        val(ii,1)=1;\n    end;\n    if length(f)>1\n        v(mxp)=v(mxp)*0-50;\n        [~,mxp]=max(v);\n        pos(ii,2)=f(mxp);\n        val(ii,2)=v(mxp);\n        if length(f)>2\n            v(mxp)=v(mxp)*0-50;\n            [~,mxp]=max(v);\n            pos(ii,3)=f(mxp);\n            val(ii,3)=v(mxp);\n        else\n            pos(ii,3)=pos(ii,2);val(ii,3)=val(ii,2);\n        end;\n    else\n        pos(ii,2)=pos(ii,1);val(ii,2)=val(ii,1);\n    end;\nend;\nend\n\n%%%------\nfunction y=zdBpower(x)\ny=10*log10(x);\nend\n\n%%%------\nfunction [y,ind,fq]=zremoveACinduction(x,fs,pos)\n%   [y,ind,fq]=removeACinduction(x,fs,pos);\n%   Function to remove AC induction\n%   x   : input speech signal \n%   fs  : sampling frequency (Hz)\n%   pos : Locations of Top-three F0 candidates (Hz)\n%   Output parameter\n%   y   : speech signal without AC induction\n%   ind : 1 indicates AC induction was detected\n%   fq  : frequency of AC induction\n\n%   Designed and coded by Hideki Kawahawra, \n%   24/June/2004\n\nx=x(:);\nind=0;\nf=pos(:);\nh50=sum(abs(f-50)<5)/sum(f>0);\nh60=sum(abs(f-60)<5)/sum(f>0);\nif (h50<0.2) && (h60<0.2);y=x;fq=0;return;end;\nind=1;\nif h50>h60\n    fq=50;\nelse\n    fq=60;\nend;\ntx=(1:length(x))'/fs;\nfqv=((-0.3:0.025:0.3)+fq);\ntxv=tx*fqv;\nfk=x'*exp(-1i*2*pi*txv)/length(x);\n[~,ix]=max(abs(fk));\nfq=fqv(ix);\ny=x-2*real(fk(ix)*exp(1i*2*pi*fq*tx));\nend\n\n%%%----\nfunction [lagspec,lx]=zlagspectestnormal(x,fs,stp,edp,shiftm,wtlm,ndiv,wflf,pc,amp,h)\n%   Lag spectrogram for F0 extraction\n%   [lagspec,lx]=lagspectestnormal(x,fs,stp,edp,shiftm,wtlm,ndiv,wflf,pc,amp,h)\n%   x   : waveform\n%   fs  : sampling frequency (Hz)\n%   stp : starting position (ms)\n%   edp : end position (ms)\n%   shiftm  : frame shift for analysis (ms)\n%   wtlm    : time window length (ms)\n%   ndiv    : number of segment in the frequency domain\n%   wflf    : frequency domain window length (Hz)\n%   pc      : power exponent for nonlinearity\n%   amp : amount of lag window compensation\n\n%   h       : handle for graph\n\n%   16/June/2004 Simplified version\n%   17/June/2004 with normalization\n\nnftm=floor((edp-stp)/shiftm);\npm=stp;\n[~,~,~,lx]=ztestspecspecnormal(x,fs,pm,wtlm,ndiv,wflf,pc,amp);\nnlx=length(lx);\nlagspec=zeros(nlx,nftm);\nfor ii=1:nftm\n    pmmul=stp+(ii-1)*shiftm;\n    [acc,~,~,lx]=ztestspecspecnormal(x,fs,pmmul,wtlm,ndiv,wflf,pc,amp);%keyboard;\n    lagspec(:,ii)=mean(acc,2)/mean(acc(1,:));\nend;\nif h>0\n    figure(h);\n    imagesc([stp edp],[0 max(lx)]*1000,max(0,lagspec));\n    axis('xy')\n    axis([stp edp 0 40]);\n    set(gca,'fontsize',16);\n    xlabel('time (ms)')\n    ylabel('lag (ms)')\n    title(['wtl=' num2str(wtlm) 'ms ndiv=' num2str(ndiv) ' wfl=' num2str(wflf) 'Hz PC=' num2str(pc) ...\n            ' fs=' num2str(fs) 'Hz amp=' num2str(amp)]);\n    drawnow;\nend;\nend\n\n%%%------\nfunction [acc,abase,fx,lx]=ztestspecspecnormal(x,fs,pm,wtlm,ndiv,wflf,pc,amp)\n%   Modified auto correlation \n%   [acc,abase,fx,lx]=testspecspecnormal(x,fs,pm,wtlm,ndiv,wflf,pc,amp);\n%   input parameters\n%   x   : signal to be analyzed\n%   fs  : sampling frequency (Hz)\n%   pm   : position to be tested (ms)\n%   wtlm    : time window length (ms)\n%   ndiv    : number of division on frequency axis\n%   wflf    : frequency window length (hz)\n%   pc  : power exponent\n%   amp : amount of lag window compensation\n%   output parameters\n%   acc : spectrogram on frequency axis\n%       : (periodicity gram on local frequency area)\n%   fx  : frequency axis\n%   lx  : lag axis\n\n%  Test program for spectrum check\n%   by Hideki Kawahara 27 March 2004\n%   29/March/2004 streamlined\n%   12/June/2004 Bias term removed\n%   16/June/2004 Simplified version\n%   17/June/2004 Spectral normalization version\n\nx=x(:);  % make x a column vector\n\nwtlms=round(wtlm/1000*fs);  % windowlength in samples\nwtlmso=floor(wtlms/2)*2+1;\nbb=(1:wtlmso)-(wtlmso-1)/2; % time base for window;\n\nfftl=2^ceil(log2(wtlmso)); % set FFT length to 2's exponent\nx=[zeros(fftl,1);x;zeros(fftl,1)]; % safeguard\n\np=round(pm/1000*fs); % analysis position in samples\nfx=(0:fftl-1)/fftl*fs;\ntx=(0:fftl-1);\ntx(tx>fftl/2)=tx(tx>fftl/2)-fftl;\ntx=tx/fs;\nlagw=exp(-(tx/0.0035).^2); % EGGF0testn12\nlagw2=exp(-(tx/0.0016).^2);% EGGF0testn12\n\nxt=x(fftl+bb+p); % waveform segment to be analyzed\nif sum(abs(xt))<1e-10 % bug fix 11/Jan./2005\n    xt=xt+randn(size(xt));\nend;\nabase=abs(fft(xt.*blackman(wtlmso),fftl));\nac=ifft(abase.^2);\nnpw=real(fft(ac.*lagw'));\npw=abase.^2.0./real(npw);\n\nfsp=fs/fftl;\nwflfs=round(wflf/fsp); % frequency window length in bins\nwflfso=floor(wflfs/2)*2+1;\nbbf=(1:wflfso)-(wflfso-1)/2; % index for frequency window\nfftlf=2^ceil(log2(wflfso)+2);\nlx=(0:fftlf/2-1)/(fsp*fftlf);\nnsht=fftl/2/ndiv;\nacc=zeros(fftlf/2,ndiv+1);\nw2=hanning(wflfso);\nampw=1-lagw*(1-1/amp);\nampw=(1-lagw2(1:fftlf/2)'*(1-1/amp))./ampw(1:fftlf/2)';\nfor ii=1:ndiv+1\n    p=rem(round(fftl/2+bbf+(ii-1)*nsht),fftl)+1;\n    ac=abs(fft((pw(p)).*w2,fftlf))*(npw(p((wflfso-1)/2))).^pc;\n    acc(:,ii)=ac(1:fftlf/2).*ampw;\nend;\nend\n\n%%%-------\nfunction pws=zVpowercalc(x,fs,wtc,shiftm,fc)\n%   pws=Vpowercalc(x,fs,wtc,shiftm,fc)\n%   x   : waveform\n%   fs  : sampling frequency (Hz)\n%   wtc : window time constatnt (ms)\n%   shifrm  : frame update interval (ms)\n%   fc  : LPF cut-off frequency (Hz)\n\n%---- window design for pwer smoothing\nt=(0:1/fs:wtc*5/1000);\nw=exp(-t/(wtc/1000));\nw=w-w(end);\nw=w/sum(w);\n\n%----- window for preprocesing LPF\nlw=round(fs/fc*2);\nb=fir1(lw-1,2*fc/fs);\nnn=length(x);\nx=fftfilt(b,[x(:);zeros(lw,1)]);\nx=x((1:nn)+round(lw/2)-1);\n\nyf=fftfilt(w,x.^2);\nyb=fftfilt(w,x(end:-1:1).^2);\nyb=yb(end:-1:1);\ny=min(yf,yb);\nnn=length(x);\n\npws=interp1((0:nn-1)/fs*1000,y,0:shiftm:(nn-1)/fs*1000);\nend\n\n%%%-----\nfunction [f0r,ecr,ac1]=zrefineF06m(x,fs,f0raw,fftl,eta,nhmx,shiftm,nl,nu)\n%\tF0 estimation refinement\n%\t[f0r,ecr]=refineF06m(x,fs,f0raw,fftl,nhmx,shiftm,nl,nu)\n%\t\tx\t\t: input waveform\n%\t\tfs\t\t: sampling frequency (Hz)\n%\t\tf0raw\t: F0 candidate (Hz)\n%\t\tfftl\t: FFT length\n%\t\teta\t\t: temporal stretch factor\n%\t\tnhmx\t: highest harmonic number\n%\t\tshiftm\t: frame shift period (ms)\n%\t\tnl\t\t: lower frame number\n%\t\tnu\t\t: uppter frame number\n%\n%\tExample of usage (with STRAIGHT)\n%\n\nf0raw=f0raw(:)';\nf0i=f0raw;\nf0i(f0i==0)=f0i(f0i==0)+160;\nfax=(0:fftl-1)/fftl*fs;\nnfr=length(f0i); % 07/August/1999 \n\nshiftl=shiftm/1000*fs;\nx=[zeros(fftl,1); x(:) ; zeros(fftl,1)]';\n\nec1=cos(2*pi*(0:fftl-1)/fftl); % first auto correlation basis function\nac1=f0raw*0;\n\ntt=((1:fftl)-fftl/2)/fs;\nth=(0:fftl-1)/fftl*2*pi;\nrr=exp(-1i*th);\n\nf0t=100;\nw1=max(0,1-abs(tt'*f0t/eta));\nw1=w1(w1>0);\nwg=exp(-pi*(tt*f0t/eta).^2);\nwgg=(wg(abs(wg)>0.0002));\nwo=fftfilt(wgg,[w1; zeros(length(wgg),1)])';\n\nxo=(0:length(wo)-1)/(length(wo)-1);\nnlo=length(wo)-1;\n\nif nl*nu <0\n\tnl=1;\n\tnu=nfr;\nend;\n\nbx=1:fftl/2+1;\npif=zeros(fftl/2+1,nfr);\ndpif=zeros(fftl/2+1,nfr);\npwm=zeros(fftl/2+1,nfr);\n\nfor kk=nl:nu\n\t\tif f0i(kk) < 40\n\t\tf0i(kk)=40;\n\tend;\n\tf0t=f0i(kk);\n\txi=0:1/nlo*f0t/100:1;\n\twa=interp1(xo,wo,xi,'*linear');\n\twal=length(wa);\n\tbb=1:wal;\n\tbias=round(fftl-wal/2+(kk-1)*shiftl);\n\tdcl=mean(x(bb+bias));\n    txm1=x(bb+bias-1);\n    tx0=x(bb+bias);\n    txp1=x(bb+bias+1);\n    if (sum(abs(txm1))<1e-20)||(sum(abs(txm1))<1e-20)||(sum(abs(txm1))<1e-20)||(sum(abs(txm1))<1e-20)\n        xtmp=x+randn(size(x)); % this if clause is a bug fix. 11/Jan./2005\n        dcl=mean(xtmp(bb+bias));\n        txm1=xtmp(bb+bias-1);\n        tx0=xtmp(bb+bias);\n        txp1=xtmp(bb+bias+1);\n    end;\n\tff0=fft((txm1-dcl).*wa,fftl);\n\tff1=fft((tx0-dcl).*wa,fftl);\n\tff2=fft((txp1-dcl).*wa,fftl);\n    ff0(ff0==0)=ff0(ff0==0)+0.000000001;\n    ff1(ff1==0)=ff1(ff1==0)+0.000000001;\n    ff2(ff2==0)=ff2(ff2==0)+0.000000001;\n\tfd=ff2.*rr-ff1;\n\tfd0=ff1.*rr-ff0;\n\tcrf=fax+(real(ff1).*imag(fd)-imag(ff1).*real(fd))./(abs(ff1).^2)*fs/pi/2;\n\tcrf0=fax+(real(ff0).*imag(fd0)-imag(ff0).*real(fd0))./(abs(ff0).^2)*fs/pi/2;\n\tpif(:,kk)=crf(bx)'*2*pi;\n\tdpif(:,kk)=(crf(bx)-crf0(bx))'*2*pi;\n\tpwm(:,kk)=abs(ff1(bx)'); % 29/July/1999\n    ac1(kk)=sum(abs(ff1).^2.0.*ec1)/sum(abs(ff1).^2);\nend;\nslp=([pif(2:fftl/2+1,:);pif(fftl/2+1,:)]-pif)/(fs/fftl*2*pi);\ndslp=([dpif(2:fftl/2+1,:);dpif(fftl/2+1,:)]-dpif)/(fs/fftl*2*pi)*fs;\nmmp=slp*0;\n\n[c1,c2]=znrmlcf3(shiftm);\nfxx=((0:fftl/2)+0.5)/fftl*fs*2*pi;\n\n%--- calculation of relative noise level\n\nfor ii=1:fftl/2+1;\n\tc2=c2*(fxx(ii)/2/pi)^2;\n\tmmp(ii,:)=(dslp(ii,:)/sqrt(c2)).^2+(slp(ii,:)/sqrt(c1)).^2;\nend;\n\n%--- Temporal smoothing\nsml=round(1.5*fs/1000/2/shiftm)*2+1; % 3 ms, and odd number\nsmb=round((sml-1)/2); % bias due to filtering\n\nsmmp=fftfilt((hanning(sml).^2)/sum((hanning(sml).^2)),[mmp zeros(fftl/2+1,sml*2)]'+0.00001)';\nsmmp(smmp==0)=smmp(smmp==0)+0.0000000001;\nsmmp=1.0./fftfilt(hanning(sml)/sum(hanning(sml)),1.0./smmp')';\nsmmp=smmp(:,max(1,(1:nfr)+sml-2)); % fixed by H.K. on 10/Dec./2002\n\n%--- Power adaptive weighting (29/July/1999)\n\nspwm=fftfilt(hanning(sml)/sum(hanning(sml)),[pwm zeros(fftl/2+1,sml*2)]')';\nspwm(spwm==0)=spwm(spwm==0)+0.00000001;\nspfm=fftfilt(hanning(sml)/sum(hanning(sml)),[pwm.*pif zeros(fftl/2+1,sml*2)]'+0.00001)';\nspif=spfm./spwm;\nspif=spif(:,(1:nfr)+smb);\n\nidx=max(0,f0i/fs*fftl);\nfqv=zeros(nhmx,nfr);\nvvv=zeros(nhmx,nfr);\n\niidx=(0:nfr-1)*(fftl/2+1)+1;\nfor ii=1:nhmx\n\tiidx=idx+iidx;\n\tvvv(ii,:)=(smmp(floor(iidx))+(iidx-floor(iidx)).*(smmp(floor(iidx)+1)-smmp(floor(iidx))))/(ii*ii);\n\tfqv(ii,:)=(spif(floor(iidx))+(iidx-floor(iidx)).*(spif(floor(iidx)+1)-spif(floor(iidx))))/2/pi/ii; % 29/July/199\nend;\nvvvf=1.0./sum(1.0./vvv);\nf0r=sum(fqv./sqrt(vvv))./sum(1.0./sqrt(vvv)).*(f0raw>0);\necr=sqrt(1.0./vvvf).*(f0raw>0)+(f0raw<=0);\nend\n\n%--------------------\nfunction [c1,c2]=znrmlcf3(f)\n\nn=100;\nx=0:1/n:3;\ng=GcBs(x,0);\ndg=[diff(g) 0]*n;\ndgs=dg/2/pi/f;\nxx=2*pi*f*x;\nc1=sum((xx.*dgs).^2)/n;\nc2=sum((xx.^2.*dgs).^2)/n;\nend\n\n%---------------------\nfunction p=GcBs(x,k)\n\ntt=x+0.0000001;\np=tt.^k.*exp(-pi*tt.^2).*(sin(pi*tt+0.0001)./(pi*tt+0.0001)).^2;\nend\n\n%%%----------------\nfunction [f0,pl]=zcombineRanking4(p,beta,wAC,wIF,prm)\n\n%        F0candidatesByIF: [2978x3 double]\n%      CNofcandidatesByIF: [2978x3 double]\n%        F0candidatesByAC: [2977x3 double]\n%      ACofcandidatesByAC: [2977x3 double]\n%               RefinedCN: [1x2977 double]\n%    FirstAutoCorrelation: [1x2977 double]\n%       F0initialEstimate: [2977x1 double]\n%    BackgroundNoiselevel: -69.1041\n%      InstantaneousPower: [1x2979 double]\n\nf0floor=prm.F0searchLowerBound; % f0floor\nf0ceil=prm.F0searchUpperBound; % f0ceil\n\nn=min([length(p.F0candidatesByIF) length(p.F0candidatesByAC)]);\n\nnvo=24;\nnvc=ceil(log2(f0ceil/f0floor))*nvo;\nfx=f0floor*2.0.^((0:nvc-1)/nvo);\nlfx=log2(fx);\nlogf0if=log2(p.F0candidatesByIF);\nlogf0ac=log2(p.F0candidatesByAC);\nrelif=max(0.000000001,(p.CNofcandidatesByIF-min(p.CNofcandidatesByIF(:,1)))./ ...\n    (max(p.CNofcandidatesByIF(:,1))-min(p.CNofcandidatesByIF(:,1))));\nrelac=max(0.000000001,((p.ACofcandidatesByAC-min(p.ACofcandidatesByAC(:,1)))./ ...\n    (max(p.ACofcandidatesByAC(:,1))-min(p.ACofcandidatesByAC(:,1)))));\nf0=zeros(n,6);\npl=zeros(n,6);\ninitv=0*lfx;\nfor ii=1:n\n    IFmap=initv;\n    ACmap=initv;\n    for jj=1:3\n        IFmap=IFmap+relif(ii,jj)^2*exp(-((logf0if(ii,jj)-lfx)/beta).^2); % 27/July/2004 ^2\n        ACmap=ACmap+relac(ii,jj)^2*exp(-((logf0ac(ii,jj)-lfx)/beta).^2); % 27/July/2004 ^2\n    end;\n    f0map=sqrt(wIF*IFmap+wAC*ACmap)/sqrt(2); % 27/July/2004 Addition\n    f0mapbak=f0map;\n    ix=find((diff([f0map(1) f0map]).*diff([f0map f0map(end)]))<0);\n    if ~isempty(ix)\n        [~,mxp]=max(f0map(ix));\n        [pl(ii,1),~]=zzParabolicInterp2(f0mapbak((-1:1)+ix(mxp)),ix(mxp));\n        [~,idsrt]=sort(-f0map(ix));\n        nix=length(ix);\n        for jj=1:6\n            if jj>nix\n                pl(ii,jj)=pl(ii,jj-1);\n                f0(ii,jj)=f0(ii,jj-1);\n            else\n                [pl(ii,jj),f0(ii,jj)]=zzParabolicInterp2(f0mapbak((-1:1)+ix((idsrt(jj)))),ix((idsrt(jj))));\n            end;\n        end;\n    else\n        pl(ii,1)=0;\n    end;\nend;\nf0=f0floor*2.0.^(f0/nvo);\nend\n\n%-------\nfunction [val,pos]=zzParabolicInterp2(yv,xo)\nlp=diff(yv);\na=lp(1)-lp(2);\nb=(lp(1)+lp(2))/2;\nxp=b/a+xo;\nval=yv(2)+0.5*a*(b/a)^2+b*(b/a);\npos=xp-1;\nend\n\n%%%---\nfunction ac1=zfirstac(x,fs,ix,wlms)\n\nwl=round(fs*wlms/1000);\nfftl=2.0^ceil(log2(wl));\nxx=x(:);\nidx=ix+(1:wl)-round(wl/2);\nxt=xx(min(length(xx),max(1,idx)));\nif sum(abs(xt))<1e-20  % bug fix 11/Jan./2005\n    xt=xt+randn(size(xt));\nend;\nfw=abs(fft(xt.*hanning(wl),fftl)).^2;\nfx=(0:fftl-1)/fftl*fs;\n[~,ixx]=min(abs(fx-4000));\nif ixx>fftl/2\n    ixx=fftl/2;\nend;\nc=cos(2*pi*fx(1:ixx)/(fx(ixx)*2));\nac1=sum(c'.*fw(1:ixx))/sum(fw(1:ixx));\nend\n\n%%%-------\n\nfunction [f0,pl]=zmultiCandAC(lx,lagspec,beta,lagsp,timesp)\n%   F0 candidates extraction from time-lag representation\n%   using palabolic interpolation\n%   and a new harmonic supression technique\n%   [f0,pl]=multiCandAC(lx,lagspec,beta,lagsp,timesp)\n%   lx  : lag axis\n%   lagspec : time-lag representation\n%   beta    : nonlinear distance measure\n%   lagsp   : lag smoothing parameter (ms)\n%   timesp  : temporal smoothing parameter (ms)\n%   output parameters\n%   f0  : fundamental frequency (Hz)\n%   pl  : peak level\n\n%   Designed and coded by Hideki Kawahara\n%   30/March/2004\n%   16/June/2004 Peak picking first\n%   17/June/2004 Peak selection taking into interaction account\n\n[nr,nc]=size(lagspec);\nimm=diff([lagspec(1,:);lagspec]).*(diff([lagspec;lagspec(end,:)]));\ndlag=diff([lagspec(1,:);lagspec]);\nlagspecz=lagspec;\nlagspecz(lx<0.002,:)=lagspecz(lx<0.002,:)-(ones(nc,1)*exp(-(lx(lx<0.002)/0.00055).^2))';\n\n%------ Harmonic supression\nmapm=zgendeconvmatrix(nr,0.6);\nlagspecz=log(exp((lagspecz-mapm*lagspecz)*20)+1)/20;\nlagspec=lagspecz;\ntls=[lagspecz;lagspecz(end,:);lagspecz(end:-1:2,:)].^beta;\n\nllx=[lx lx(end) lx(end:-1:2)]';\nlagw=exp(-(llx/(lagsp/1000)).^2); % This should be propotional to lag.\nlagw=lagw/sum(lagw);\nflagw=real(fft(lagw));\nfor ii=1:nc\n    tls(:,ii)=real(ifft(fft(tls(:,ii)).*flagw));\nend;\n\ntmsm=round((timesp-1)/2)*2+1; % temporal smoothing (ms) assuming shift=1 ms\nwt=hanning(tmsm);\nwt=wt/sum(wt);\n% temporal smoothing using \nlagsms=fftfilt(wt,[zeros(nr,tmsm) tls(1:nr,:) zeros(nr,tmsm)]')';\nlagsms=lagsms(:,(1:nc)+(tmsm-1)/2*3);\n\nlagsms=abs(lagsms).^(1/beta);\nf0=zeros(nc,3);\npl=zeros(nc,3);\nfor ii=1:nc\n    ix=find((imm(:,ii)<0)&(dlag(:,ii)>0));\n    [~,mxp]=max(lagsms(ix,ii));\n    [pl(ii,1),pos]=ParabolicInterp(lagspec((-1:1)+ix(mxp),ii),ix(mxp));\n    f0(ii,1)=pos/lx(2);\n    if length(ix)>1\n        lagsms(ix(mxp),ii)=lagsms(ix(mxp),ii)*0;\n        [~,mxp]=max(lagsms(ix,ii));\n        [pl(ii,2),pos]=ParabolicInterp(lagspec((-1:1)+ix(mxp),ii),ix(mxp));\n        f0(ii,2)=pos/lx(2);\n        if length(ix)>2\n            lagsms(ix(mxp),ii)=lagsms(ix(mxp),ii)*0;\n            [~,mxp]=max(lagsms(ix,ii));\n            [pl(ii,3),pos]=ParabolicInterp(lagspec((-1:1)+ix(mxp),ii),ix(mxp));\n            f0(ii,3)=pos/lx(2);\n        else\n            f0(ii,3)=f0(ii,2);pl(ii,3)=pl(ii,2);\n        end;\n    else\n        f0(ii,2)=f0(ii,1);pl(ii,2)=pl(ii,1);\n    end;\nend;\nend\n\nfunction [val,pos]=ParabolicInterp(yv,xo)\nlp=diff(yv);\na=lp(1)-lp(2);\nb=(lp(1)+lp(2))/2;\nxp=b/a+xo;\nval=yv(2)+0.5*a*(b/a)^2+b*(b/a);\nif xp>max(xo)+1\n    xp=max(xo)+1;\n    val=yv(end);\nend;\nif xp<min(xo)-1\n    xp=min(xo)-1;\n    val=yv(1);\nend;\npos=1/(xp-1);\nend\n\nfunction mapm=zgendeconvmatrix(n,a)\n%   function mapm=gendeconvmatrix(n,a);\n%   n   : size of the matrix\n%   a   : reductio ncoefficient\n\nmapm=zeros(n,n);\nfor ii=3:n\n    for k=[2 3 5]\n        bet=(ii-1)/k+1;\n        lbet=floor(bet);\n        ubet=lbet+1;\n        mapm(ii,lbet)=mapm(ii,lbet)+(1-(bet-lbet))*a^(k-1);\n        mapm(ii,ubet)=mapm(ii,ubet)+(1-(ubet-bet))*a^(k-1);\n    end;\nend;\nend\n\n%%%---------------\nfunction [f0c,relc]=zfillf0gaps6(p,f0,rel,cseg,prm)\n\nf0c=f0;\nrelc=rel;\nf0v=p.F0candidatesByMix;\nf0cand=f0v;\nrelv=p.RELofcandidatesByMix;\npwrdb=p.InstantaneousPower;\nf0jumpt=prm.MaxumumPermissibleOctaveJump;\nnsdt=prm.SDforTrackingNormalization;\n\n%---- noiselevel\nmxpwsdb=max(pwrdb);\n[hstgrm,binlvl]=hist(pwrdb,mxpwsdb+(-60:2));\nq10=interp1(cumsum(hstgrm+0.000000001)/sum(hstgrm)*100,binlvl,10); % 10% quantile level\n[~,minid]=min(abs(q10-binlvl));\nbb=max(1,min(length(binlvl),minid+(-5:5))); % search range 10 dB % safeguard\nnoiselevel=sum(hstgrm(bb).*binlvl(bb))/sum(hstgrm(bb)); \n\n[nr,~]=size(cseg);\nnf0=length(f0);\nf0raw0=f0;\nfor ii=1:nr;\n    if ii>nr\n        ub=length(f0);\n    else\n        ub=min(length(f0),cseg(ii,1));\n    end;\n    if ii==1\n        lb=1;\n    elseif ii>nr\n        lb=max(1,cseg(ii-1,2));\n    else\n        lb=round((cseg(ii,1)+cseg(ii-1,2))/2);\n    end;\n    bp=lb;ep=ub;\n    f0raw3=f0raw0;\n    f0raw3(ep)=f0(ep);%f0cand(acp,1);\n    lastf0=f0raw3(ep);\n    [f0raw3,~]=ztraceInAsegment2(f0raw3,f0cand,relv,pwrdb,ep,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n    f0raw0=f0raw3;\n    f0c(bp:ep)=f0raw0(bp:ep);\n    lb=cseg(ii,2);\n    if ii<nr\n        ub=round((cseg(ii,2)+cseg(ii+1,1))/2);\n    else\n        ub=length(f0);\n    end;\n    bp=lb;ep=ub;\n    f0raw2=f0raw0;\n    f0raw2(bp)=f0(bp);%f0cand(acp,1);\n    lastf0=f0raw2(bp);\n    [f0raw2,~]=ztraceInAsegment2(f0raw2,f0cand,relv,pwrdb,bp,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n    f0raw0=f0raw2;\n    f0c(bp:ep)=f0raw0(bp:ep);\nend;\nend\n\nfunction [f0raw0,sprob]=ztraceInAsegment2(f0rawin,f0cand,relv,pwsdb,acp,lastf0in,lb,ub,nn,f0jump,nsd,noiselevel)\n\nlastf0=lastf0in;\nf0raw0=f0rawin;\nmaxpower=max(pwsdb); \nreliablepowerth=max(noiselevel+10, min(((3*maxpower+noiselevel)/4))); %24/July/2004 #2\nsprob=0; % initial probability\nif acp==ub;f0raw0(ub)=lastf0in;end;\nif acp==lb;f0raw0(lb)=lastf0in;end;\nfor jj=acp-1:-1:lb\n    bsb=max(1,jj:-1:jj-5); % seraching bound\n    [dmy,idx]=max(exp(-((log2(f0cand(bsb,:)')-log2(lastf0))/nsd).^2).*(relv(bsb,:)'));\n    [dmy2,idxx]=max(dmy);\n    idx=idx(idxx);\n    jjmx=bsb(idxx);\n    if abs(log2(f0cand(jjmx,idx))-log2(lastf0))<f0jump\n        dd=abs(jjmx-jj);\n        if dd==0;\n            f0raw0(jj)=f0cand(jjmx,idx);\n            if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2);end;\n        else \n            f0raw0(jj)=lastf0+(1/(dd+1))*(f0cand(jjmx,idx)-lastf0);\n            if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2);end;%-0.1;end;\n        end;\n    else\n        f0raw0(jj)=lastf0;\n        if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2)-10;end;\n    end\n    lastf0=f0raw0(jj);\nend;\nlastf0=lastf0in;%f0cand(acp,1);\nfor jj=acp+1:ub\n    bsb=min(nn,jj:jj+5); % seraching bound\n    [dmy,idx]=max(exp(-((log2(f0cand(bsb,:)')-log2(lastf0))/nsd).^2).*(relv(bsb,:)'));\n    [dmy2,idxx]=max(dmy);\n    idx=idx(idxx);\n    jjmx=bsb(idxx);\n    if abs(log2(f0cand(jjmx,idx))-log2(lastf0))<f0jump\n        dd=abs(jjmx-jj);\n        if dd==0;\n            f0raw0(jj)=f0cand(jjmx,idx);\n            if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2);end;\n        else \n            f0raw0(jj)=lastf0+(1/(dd+1))*(f0cand(jjmx,idx)-lastf0);\n            if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2);end;%-0.1;end;\n        end;\n    else\n        f0raw0(jj)=lastf0;\n        if pwsdb(jj)>reliablepowerth;sprob=sprob+log2(dmy2)-10;end;\n    end\n    lastf0=f0raw0(jj);\nend;\nsprob=2.0.^(sprob/(ub-lb+1)); % fix (+1) on 11/Jan./05\nend\n\n%%%-----\nfunction [f0,rel,cseg]=zcontiguousSegment10(p,prm)\n%   This version was revised from 808.\n%   Further refinement for additional scan\n\nf0floor=prm.F0searchLowerBound; % f0floor\nf0ceil=prm.F0searchUpperBound; % f0ceil\n\npwsdb=p.InstantaneousPower;\nf0cand=p.F0candidatesByMix;\nrelv=p.RELofcandidatesByMix;\npwrdb=p.InstantaneousPower;\n\nrelv(relv==0)=relv(relv==0)+0.00001;\nf0jumpt=prm.MaxumumPermissibleOctaveJump;\nnsdt=prm.SDforTrackingNormalization;\n\nnn=min(length(pwsdb),length(f0cand));\npwsdb=pwsdb(1:nn);\nf0cand=f0cand(1:nn,:);\nrelv=relv(1:nn,:);\nDispOn=prm.DisplayPlots;\n\n%---- noiselevel\nmxpwsdb=max(pwsdb);\n[hstgrm,binlvl]=hist(pwsdb,mxpwsdb+(-60:2));\nq10=interp1(cumsum(hstgrm+0.000000001)/sum(hstgrm)*100,binlvl,10); % 10% quantile level\n[~,minid]=min(abs(q10-binlvl));\nbb=max(1,min(length(binlvl),minid+(-5:5))); % search range 10 dB % safeguard\nnoiselevel=sum(hstgrm(bb).*binlvl(bb))/sum(hstgrm(bb)); \nwellovernoize=(4*noiselevel+mxpwsdb)/5;\nif wellovernoize>mxpwsdb-10;\n    wellovernoize=mxpwsdb-10;\n    noiselevel=(5*wellovernoize-mxpwsdb)/4;\nend; % safeguard 25/Sept./2004\n\n%---- search for contiguous segments that consists of best candidates\nf0=f0cand(:,1)*0;\nrel=relv(:,1)*0;\n\nmaskr=f0cand*0+1; % masker for preventing multiple assignment\n[dmy,idx]=sort(-relv(:,1));\nidx=idx(-dmy>0.16);\nif DispOn\n    figure\n    semilogy(f0cand(:,1),'c');grid on;\n    axis([0 nn f0floor f0ceil]);\n    hold on\n    drawnow\nend;\nnseg=0;\nsegv=zeros(length(idx),2);\nsratev=zeros(length(idx),1);\nsegstr = struct;\nfor ii=1:length(idx);\n    if (maskr(idx(ii),1)>0) && (pwsdb(idx(ii))>wellovernoize)\n        [f0seg,relseg,lb,ub,srate,maskr]=zsearchforContiguousSegment(f0cand,relv,maskr,idx(ii),pwsdb,noiselevel);\n        if (~isempty(f0seg)) && (srate>0.12)  && ((ub-lb+1)>13)\n            nseg=nseg+1;\n            segv(nseg,:)=[lb ub];\n            segstr(nseg).f0Segment=f0seg(lb:ub);\n            segstr(nseg).reliabilitySegment=relseg(lb:ub);\n            sratev(nseg)=srate*(1-1/max(1.4,sqrt((ub-lb+1)/40))); % reliability with DF normalization\n            if DispOn\n                disp(['Segment (' num2str(lb,7) ':' num2str(ub,7) ') with rel=' num2str(srate)]);\n                semilogy(lb:ub,f0seg(lb:ub));drawnow;\n            end;\n        end;\n    end;\nend;\nsegv=segv(1:nseg,:);\nsratev=sratev(1:nseg);\n[~,idrel]=sort(-sratev);\nif DispOn\n    hold off\n    figure\n    semilogy(f0cand(:,1),'c');grid on;\n    axis([0 nn f0floor f0ceil]);\n    hold on\n    drawnow\nend;\nfor ii=1:nseg\n    icp=idrel(ii);\n    lb=segv(icp,1); ub=segv(icp,2);\n    validind=(sum(f0(lb:ub)>0)==0);\n    if validind;f0(lb:ub)=segstr(icp).f0Segment;rel(lb:ub)=segstr(icp).reliabilitySegment;end;\n    if DispOn && validind\n        semilogy(lb:ub,segstr(icp).f0Segment);drawnow;\n    end;\nend;\n%---- scan and reorganize segments\nInInd=0;\ncseg=zeros(nseg,2);\ncrseg=0;\nfor ii=1:nn\n    if (InInd==0) && (f0(ii)>0)\n        crseg=crseg+1;\n        cseg(crseg,1)=ii;\n        InInd=1;\n    elseif (InInd==1) && (f0(ii)==0) || ((sum((ii-1)==segv(:,2))>0) && (pwsdb(ii)<(noiselevel+4*mxpwsdb)/5)) % mod 09/Aug./04\n        cseg(crseg,2)=ii-1;\n        InInd=0;\n    end;\nend;\nif cseg(crseg,2)==0;cseg(crseg,2)=nn;end;\ncseg=cseg(1:crseg,:);\n\n%---- check for each segment if it is contiguous enough\nnf0=length(f0);\nfor ii=1:crseg\n    lb=cseg(ii,1);ub=cseg(ii,2);\n    maxjmp=max(abs(diff(log2(f0(lb:ub)))));\n    if maxjmp>0.4\n        disp(['Discontinuity in (' num2str(lb,7) ':' num2str(ub,7) '), Max jump=' num2str(maxjmp,7) ' oct.'])\n        f0raw0=f0;\n        dmy=max(relv(lb:ub,:), 2);\n        [~,ixmx]=max(dmy(:));\n        cpos=lb+ixmx-1;\n        bp=lb;ep=ub;\n        %%f0bak=f0raw0;\n        f0raw1=f0raw0;\n        f0raw2=f0raw0;\n        f0raw3=f0raw0;\n        f0raw0(cpos)=f0cand(cpos,1);\n        lastf0=f0cand(cpos,1);\n        [f0rawm,sprob0]=ztraceInAsegment2(f0raw0,f0cand,relv,pwrdb,cpos,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n        f0raw1(cpos)=f0cand(cpos,2);%f0cand(acp,1);\n        lastf0=f0raw1(cpos);\n        [f0raw1,sprob1]=ztraceInAsegment2(f0raw1,f0cand,relv,pwrdb,cpos,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n        f0raw2(bp)=f0(bp);%f0cand(acp,1);\n        lastf0=f0raw2(bp);\n        [f0raw2,sprob2]=ztraceInAsegment2(f0raw2,f0cand,relv,pwrdb,bp,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n        f0raw3(ep)=f0cand(ep,1);%f0cand(acp,1);\n        lastf0=f0raw3(ep);\n        [f0raw3,sprob3]=ztraceInAsegment2(f0raw3,f0cand,relv,pwrdb,ep,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n        [~,imx]=max([sprob0 sprob1 sprob2 sprob3]);\n        switch imx\n            case 1\n                f0raw0=f0rawm;\n            case 2\n                f0raw0=f0raw1;\n            case 3\n                f0raw0=f0raw2;\n            case 4\n                f0raw0=f0raw3;\n        end;\n        f0(lb:ub)=f0raw0(lb:ub);\n    end;\nend;\n\n%---- get robust distribution and check for anomalies\n[hgf0,~]=sort(log2(f0(f0>0)));\nid10=round(0.1*length(hgf0));\nid90=round(0.9*length(hgf0));\nrsd=std(hgf0(id10:id90));\nmf0=mean(hgf0(id10:id90));\ncsego=cseg;\ncseg=cseg*0;\nnseg=0;\nf0o=f0;\nf0=f0*0;\nfor ii=1:crseg\n    lb=csego(ii,1);ub=csego(ii,2);\n    if abs(mean(log2(f0o(lb:ub)))-mf0)<min(1.2,max(0.9,5*rsd)) && mean(pwrdb(lb:ub))>(2*noiselevel+mxpwsdb)/3;\n        nseg=nseg+1;\n        cseg(nseg,1)=lb;\n        cseg(nseg,2)=ub;\n        f0(lb:ub)=f0o(lb:ub);\n    end;\nend;\ncseg=cseg(1:nseg,:);\n\n%---- check for isolated small segments\nsegv=cseg;\ncseg=cseg*0;\nnseg=0;\nf0bk=f0;\nf0=f0*0;\nf0bk(1)=1;\nlastend=1;\n[nrseg,~]=size(cseg); % bug fix, 31/Aug./2004\nfor ii=1:nrseg\n    lb=segv(ii,1);ub=segv(ii,2);\n    if ii<nrseg\n        nexttop=segv(ii+1,1);\n    else\n        nexttop=ub; % bug fix, 11/Jan./2005\n    end;\n    ipause=(lb-lastend+1);fpause=(nexttop-ub+1);\n    if ((ipause<50) || (fpause<50)) && abs(log2(f0bk(lastend))-log2(f0bk(lb)))>0.6 ...\n            && abs(log2(f0bk(ub))-log2(f0bk(nexttop)))>0.6 && (ub-lb+1)<50 && mean(relseg(lb:ub))<0.5\n        %do nothing\n    else\n        nseg=nseg+1;\n        f0(lb:ub)=f0bk(lb:ub);\n        cseg(nseg,:)=[lb ub];\n    end;\n    lastend=ub;\nend;\n\n%---- check for dominant peaks if it is selected as a voiced segment\n%----- mark syllable centers\nwsml=81;\npwsdbl=[ones(wsml,1)*pwsdb(1);pwsdb(:);ones(2*wsml,1)*pwsdb(end)];\npwsdbs=fftfilt(hanning(wsml)/sum(hanning(wsml)),pwsdbl);\npwsdbs=pwsdbs((1:length(pwsdb))+round(3*wsml/2));\ndpwsdbs=diff([pwsdbs(1);pwsdbs]);\ndpwsdbsm=diff([pwsdbs;pwsdbs(end)]);\npv=find((dpwsdbs.*dpwsdbsm<0)&(dpwsdbsm<=0));\ndv=find((dpwsdbs.*dpwsdbsm<0)&(dpwsdbsm>0));\n% -------\n\nf0raw0=f0cand(:,1);\navf0=mean(f0(f0>0));\nlogavf0=log2(avf0);\nrelv2=relv.*exp(-((log2(f0cand)-logavf0)/1).^2);\nreliablelevel=(noiselevel+2*mxpwsdb)/3;\nfor ii=1:length(pv)\n    if pwsdb(pv(ii)) > reliablelevel\n        if f0(pv(ii))==0\n            disp(['Missing dominant segment that is centered at:' num2str(pv(ii),7) ' (ms)']);\n            lb=max(dv(dv<pv(ii)));\n            if isempty(lb);lb=1;end;\n            ub=min(dv(dv>pv(ii)));\n            if isempty(ub);ub=nn;end;\n            bp=lb;ep=ub;\n            peaklvl=pwsdb(pv(ii));\n            for bp=pv(ii)-1:-1:lb\n                if pwsdb(bp) < peaklvl-9; break;end;\n            end;\n            for ep=pv(ii)+1:ub\n                if pwsdb(ep) < peaklvl-9; break;end;\n            end;\n            disp(['segment (' num2str(bp,7) ':' num2str(ep,7) ') is isolated.']);\n            lb=bp;ub=ep;\n            mx=max(relv2(lb:ub,:), 2);\n            [~,imx2]=max(mx(:));\n            cpos=lb+imx2-1;\n            f0raw1=f0raw0;\n            f0raw0(cpos)=f0cand(cpos,1);\n            lastf0=f0cand(cpos,1);\n            [f0rawm,sprob0]=ztraceInAsegment2(f0raw0,f0cand,relv2,pwrdb+10,cpos,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n            f0raw1(cpos)=f0cand(cpos,2);%f0cand(acp,1);\n            lastf0=f0raw1(cpos);\n            [f0raw1,sprob1]=ztraceInAsegment2(f0raw1,f0cand,relv2,pwrdb+10,cpos,lastf0,bp,ep,nf0,f0jumpt,nsdt,noiselevel);\n            [~,imx]=max([sprob0 sprob1]);\n            switch imx\n                case 1\n                    f0raw0=f0rawm;\n                case 2\n                    f0raw0=f0raw1;\n            end;\n            f0(lb:ub)=f0raw0(lb:ub);\n        end;\n    end;\nend;\n\n%---- final scan and reorganize segments\nInInd=0;\ncseg=zeros(nn,2);\ncrseg=0;\nfor ii=1:nn\n    if (InInd==0) && (f0(ii)>0)\n        crseg=crseg+1;\n        cseg(crseg,1)=ii;\n        InInd=1;\n    elseif (InInd==1) && (f0(ii)==0)\n        cseg(crseg,2)=ii-1;\n        InInd=0;\n    end;\nend;\nif cseg(crseg,2)==0;cseg(crseg,2)=nn;end;\ncseg=cseg(1:crseg,:);\n\nif DispOn\n    h=semilogy(f0);\n    set(h,'linewidth',2);\nend;\nend\n\n%---- internal functions\n\nfunction [f0seg,relseg,lb,ub,srate,maskr]=zsearchforContiguousSegment(f0cand,relv,maskrin,acp,pwsdb,noiselevel)\n\nf0seg=f0cand(:,1)*0;\nrelseg=f0seg;\nsrate=0;\nmaskr=maskrin;\nok=1;\nnn=length(f0seg);\n\nlastf0=f0cand(acp,1);\nf0seg(acp)=lastf0;\nrelseg(acp)=relv(acp,1);\nlb=acp;ub=acp;\nfor ii=acp-1:-1:1\n    [bestdistance,idx]=min(abs(log2(lastf0)-log2(f0cand(ii,:))));\n    if (bestdistance>0.1) || (pwsdb(ii)<noiselevel+6) || (maskr(ii,idx)==0) || (relv(ii,idx)<0.17)\n        break\n    else\n        lb=ii;\n        lastf0=f0cand(ii,idx);\n        f0seg(ii)=lastf0;\n        relseg(ii)=relv(ii,idx);\n        srate=srate+relv(ii,idx);\n        %%wmaskr(ii,:)=maskr(ii,:)*0;\n    end;\nend;\nif ok==0;return;end;\nlastf0=f0cand(acp,1);\nfor ii=acp+1:nn\n    [bestdistance,idx]=min(abs(log2(lastf0)-log2(f0cand(ii,:))));\n    if (bestdistance>0.1) || (pwsdb(ii)<noiselevel+6) || (maskr(ii,idx)==0) || (relv(ii,idx)<0.05)\n        break\n    else\n        ub=ii;\n        lastf0=f0cand(ii,idx);\n        f0seg(ii)=lastf0;\n        relseg(ii)=relv(ii,idx);\n        srate=srate+relv(ii,idx);\n        maskr(ii,:)=maskr(ii,:)*0;\n    end;\nend;\nmaskr(acp,:)=maskr(acp,:)*0;\nmaskr(lb:ub,:)=maskr(lb:ub,:)*0;\nsrate=srate/(ub-lb+1);\nend\n\n%%%----- V/UV decision\nfunction vuv=zvuvdecision4(f0,p)\n%   Simple V/UV decision logic\n%   Originally designed and coded by Hideki Kawahara\n%   15/Aug./2004\n\npwsdb=p.InstantaneousPower;\nrel=p.RELofcandidatesByMix;\nmaxpwsdb=max(pwsdb);\nnoiselevel=p.BackgroundNoiselevel;\n\n%---- onset and offset candidates \nnw=40;\nnrw=3;\ntt=-nw:nw;\npws=10.0.^(pwsdb/20);\npws=pws(:);\nwwh=exp(-(tt/(nw/2.5)).^2).*(0.5-1.0./(1+exp(-tt/nrw)));\ndpw=fftfilt(wwh,[pws;zeros(nw*2,1)]);\ndpw=dpw((1:length(pws))+nw);\nbiast=nrw*3;\n\nddpw=diff([dpw(1);dpw]);\nddpwm=diff([dpw;dpw(end)]);\nonv=find((ddpw.*ddpwm<0)&(ddpwm<=0));\n\n%---- search for voiced segments\nvuv=(pwsdb>(2*maxpwsdb+noiselevel)/3);\n[pv,~]=zpeakdipdetect(p,81);\nnp=length(pv);\nnn=min(length(vuv),length(f0));\nvuv=vuv*0;\nlastp=2;\nfor ii=1:np\n    if (pwsdb(pv(ii))>(1.2*maxpwsdb+noiselevel)/2.2) && (pv(ii)>lastp)\n        lb=lastp; %max(dv(dv<pv(ii)));\n        ub=nn-1; %min(dv(dv>pv(ii)));\n        cp=pv(ii);\n        bp=cp;ep=cp;\n        for bp=cp-1:-1:lb\n            if (pwsdb(bp)<(maxpwsdb+2.3*noiselevel)/3.3) || ...\n               ((pwsdb(bp)<(1.5*maxpwsdb+noiselevel)/2.5) && (rel(bp)<0.3)) || ...\n               ((pwsdb(bp)<(1.5*maxpwsdb+noiselevel)/2.5) && (abs(log2(f0(bp)/f0(bp-1)))>0.1))\n                break\n            end;\n        end;\n        [dmy,ix]=min(abs(onv-bp));\n        if dmy<20; bp=max(1,onv(ix)-biast);end;\n        for ep=cp+1:ub %min(length(f0)-1,ub) % safe giard 11/Jan./05\n            if (pwsdb(ep)<(maxpwsdb+5*noiselevel)/6) || ... %\n               ((pwsdb(ep)<(maxpwsdb+1.3*noiselevel)/2.3) && (rel(ep)<0.25)) || ...\n               ((pwsdb(ep)<(maxpwsdb+0.7*noiselevel)/1.7) && (abs(log2(f0(ep)/f0(ep+1)))>0.1))\n                break;\n            end;\n        end;\n        vuv(bp:ep)=vuv(bp:ep)*0+1;\n        lastp=ep;\n    end;\nend;\nend\n\n%---- check for dominant peaks if it is selected as a voiced segment\nfunction [pv,dv]=zpeakdipdetect(p,wsml)\n\npwsdb=p.InstantaneousPower;\n%----- mark syllable centers\npwsdbl=[ones(wsml,1)*pwsdb(1);pwsdb(:);ones(2*wsml,1)*pwsdb(end)];\npwsdbs=fftfilt(hanning(wsml)/sum(hanning(wsml)),pwsdbl);\npwsdbs=pwsdbs((1:length(pwsdb))+round(3*wsml/2));\ndpwsdbs=diff([pwsdbs(1);pwsdbs]);\ndpwsdbsm=diff([pwsdbs;pwsdbs(end)]);\npv=find((dpwsdbs.*dpwsdbsm<0)&(dpwsdbsm<=0));\ndv=find((dpwsdbs.*dpwsdbsm<0)&(dpwsdbsm>0));\nend\n"
  },
  {
    "path": "src/ReadBinaryData.m",
    "content": "function data = ReadBinaryData(path_name)\ndata = [];\nfid = fopen(path_name);\nmagic = int8('magic');\nread_magic = fread(fid, 5, 'int8');\nfor ii = 1:5\n    if magic(ii) ~= read_magic(ii)\n        return;\n    end;\nend;\nn_row = fread(fid, 1, 'int32');\nn_column = fread(fid, 1, 'int32');\ndata = zeros(n_row, n_column);\nfor ii = 1:n_row\n    data(ii, :) = double(fread(fid, n_column, 'float32'));\nend;\nfclose(fid);\nend"
  },
  {
    "path": "src/SynthesizeLegacy_STRAIGHT_default.m",
    "content": "function syntheszed_signal = SynthesizeLegacy_STRAIGHT_default(x, fs)\n% Conditions are based on the web document\n% \n\nf0raw = MulticueF0v14(x,fs);\nap = exstraightAPind(x,fs,f0raw);\nn3sgram=exstraightspec(x,f0raw,fs);\nsyntheszed_signal = exstraightsynth(f0raw,n3sgram,ap,fs);\nend"
  },
  {
    "path": "src/TestAnalysisRegression.m",
    "content": "function output = TestAnalysisRegression(n_test)\nif ~isOctave\n  rng('shuffle'); % initialize frozen random number\nend;\noutput = false;\noriginal_speech_dir = '/Users/kawahara/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\ntarget_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisData/';\ntarget_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveData/';\ntarget_files = dir([target_wave_dir '*.wav']);\nn_files = length(target_files);\nselected_id = randi(n_files, n_test);\nfor ii = 1:n_test\n  tmp_name = target_files(selected_id(ii)).name;\n  [x, fs] = audioread([original_speech_dir tmp_name(1:4) '/' tmp_name]);\n  disp([num2str(ii) ': ' tmp_name ' ' datestr(now)]);\n  if isOctave\n    eval(command1);\n    eval(command2);\n  else\n    rng(12345); % initialize frozen random number\n  end;\n  f0raw = MulticueF0v14(x, fs);\n  ap = exstraightAPind(x, fs, f0raw);\n  n3sgram=exstraightspec(x, f0raw, fs);\n  tmp_name_root = tmp_name(1:end - 4);\n  if ~CheckAnalysisData(f0raw, ap, n3sgram, target_analysis_dir, tmp_name_root)\n    disp(['Failed: ' tmp_name ' data is not similar.']);\n    return;\n  end;\n  %y = exstraightsynth(f0raw,n3sgram,ap,fs);\nend;\ndisp(['Success! ' num2str(n_test) ' files are passed analysis regression.']);\noutput = true;\nend"
  },
  {
    "path": "src/TestAnalysisRegressionR.m",
    "content": "function output = TestAnalysisRegressionR(n_test)\noutput = false;\noriginal_speech_dir = '/Users/kawahara/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\ntarget_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisDataR/';\ntarget_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveDataR/';\ntarget_files = dir([target_wave_dir '*.wav']);\nn_files = length(target_files);\nselected_id = randi(n_files, n_test);\nfor ii = 1:n_test\n  tmp_name = target_files(selected_id(ii)).name;\n  [x, fs] = audioread([original_speech_dir tmp_name(1:4) '/' tmp_name]);\n  disp([num2str(ii) ': ' tmp_name ' ' datestr(now)]);\n  if ~isOctave; rng(12345); end; % initialize frozen random number\n  f0raw = MulticueF0v14(x, fs);\n  ap = exstraightAPind(x, fs, f0raw);\n  n3sgram=exstraightspec(x, f0raw, fs);\n  tmp_name_root = tmp_name(1:end - 4);\n  if ~CheckAnalysisData(f0raw, ap, n3sgram, target_analysis_dir, tmp_name_root)\n    disp(['Failed: ' tmp_name ' data is not similar.']);\n    return;\n  end;\n  %y = exstraightsynth(f0raw,n3sgram,ap,fs);\nend;\ndisp(['Success! ' num2str(n_test) ' files are passed analysis regression.']);\noutput = true;\nend"
  },
  {
    "path": "src/TestCopySynthRegression.m",
    "content": "function output = TestCopySynthRegression(n_test)\noutput = false;\noriginal_speech_dir = '~/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\ntarget_analysis_dir = '~/m-file/STRAIGHTV40_007e/analysisData/';\ntarget_wave_dir = '~/m-file/STRAIGHTV40_007e/waveData/';\ntarget_files = dir([target_wave_dir '*.wav']);\nn_files = length(target_files);\nselected_id = randi(n_files, n_test);\nfor ii = 1:n_test\n  tmp_name = target_files(selected_id(ii)).name;\n  [x, fs] = audioread([original_speech_dir tmp_name(1:4) '/' tmp_name]);\n  disp([num2str(ii) ': ' tmp_name ' ' datestr(now)]);\n  rng(12345); % initialize frozen random number\n  f0raw = MulticueF0v14(x, fs);\n  ap = exstraightAPind(x, fs, f0raw);\n  n3sgram=exstraightspec(x, f0raw, fs);\n  tmp_name_root = tmp_name(1:end - 4);\n  if ~CheckAnalysisData(f0raw, ap, n3sgram, target_analysis_dir, tmp_name_root)\n    disp(['Failed: ' tmp_name ' data is not similar.']);\n  end;\n  wave_pathname = [target_wave_dir tmp_name];\n  [sy, fs] = audioread(wave_pathname);\n  y = exstraightsynth(f0raw,n3sgram,ap,fs);\n  if std(sy - y / max(abs(y)) * 0.9) / std(sy) > 10 ^ (-3)\n    disp(['Failed! ' tmp_name ' copy synthesis test.']);\n    keyboard\n    return;\n  end;\nend;\ndisp(['Success! ' num2str(n_test) ' files are passed copy-synth regression.']);\noutput = true;\nend"
  },
  {
    "path": "src/TestCopySynthRegressionR.m",
    "content": "function output = TestCopySynthRegressionR(n_test)\noutput = false;\noriginal_speech_dir = '/Users/kawahara/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\nif isOctave\n  target_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisDataO/';\n  target_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveDataO/';\nelse\n  target_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisDataR/';\n  target_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveDataR/';\nend;\ntarget_files = dir([target_wave_dir '*.wav']);\nn_files = length(target_files);\nselected_id = randi(n_files, n_test);\ncommand1 = 'rand(\"seed\", 12345);';\ncommand2 = 'randn(\"seed\", 12345);';\nfor ii = 1:n_test\n  tmp_name = target_files(selected_id(ii)).name;\n  [x, fs] = audioread([original_speech_dir tmp_name(1:4) '/' tmp_name]);\n  disp([num2str(ii) ': ' tmp_name ' ' datestr(now)]);\n  if isOctave\n    eval(command1);\n    eval(command2);\n  else\n    rng(12345); % initialize frozen random number\n  end;\n  f0raw = MulticueF0v14(x, fs);\n  ap = exstraightAPind(x, fs, f0raw);\n  n3sgram=exstraightspec(x, f0raw, fs);\n  tmp_name_root = tmp_name(1:end - 4);\n  if ~CheckAnalysisData(f0raw, ap, n3sgram, target_analysis_dir, tmp_name_root)\n    disp(['Failed: ' tmp_name ' data is not similar.']);\n  end;\n  wave_pathname = [target_wave_dir tmp_name];\n  [sy, fs] = audioread(wave_pathname);\n  if isOctave\n    eval(command1);\n    eval(command2);\n  else\n    rng(12345); % initialize frozen random number\n  end;\n  y = exstraightsynth(f0raw,n3sgram,ap,fs);\n  disp(['Relative error SD: ' num2str(100 * std(sy - y / max(abs(y)) * 0.9) / std(sy)) ' %']);\n  if std(sy - y / max(abs(y)) * 0.9) / std(sy) > 10 ^ (-3)\n    disp(['Failed! ' tmp_name ' copy synthesis test.']);\n    keyboard\n    return;\n  end;\nend;\ndisp(['Success! ' num2str(n_test) ' files are passed copy-synth regression.']);\noutput = true;\nend"
  },
  {
    "path": "src/WriteBinaryData.m",
    "content": "function WriteBinaryData(path_name, data)\n[n_row, n_column] = size(data);\nfid = fopen(path_name, 'w');\nmagic = int8('magic');\nfwrite(fid, magic, 'int8');\nfwrite(fid, int32(n_row), 'int32');\nfwrite(fid, int32(n_column), 'int32');\nfor ii = 1:n_row\n  fwrite(fid, single(data(ii, :)), 'float32'); \nend;\nfclose(fid);\nend"
  },
  {
    "path": "src/aiffread.m",
    "content": "function [x,fs]=aiffread(fname)\n\n\n%\tfunction [x,fs]=aiffread(fname)\n%\tRead AIFF and AIFF-C file\n%\tThis is a reduced version and does not fulfill the\n%\tAIFF-C standard.\n\n%\tCoded by Hideki Kawahara based on \"Audio Interchange file format AIFF-C draft\"\n%\t\tby Apple Computer inc. 8/26/91\n%\t14/Feb./1998\n%\t17/Feb./1998\n%\t14/Jan./1999 bug fix for Windows\n\nfid=fopen(fname,'r','ieee-be.l64');\nid.form=fread(fid,4,'char');\nid.formcksz=fread(fid,1,'int32');\nid.formtp=fread(fid,4,'char');\nx=[];fs=44100;\nif ~strcmp(char(id.form),['F';'O';'R';'M'])\n\tchar(id.form)\n\tdisp('This is not a proper AIFF file.');\n\treturn;\nend;\nif ~strcmp(char(id.formtp),['A';'I';'F';'F']) && ~strcmp(char(id.formtp),['A';'I';'F';'C'])\n    char(id.formtp)\n\tdisp('This is not a proper AIFF file.');\n\treturn;\nend;\n[id.comm,na]=fread(fid,4,'uchar');\nwhile na>3\nswitch(strcat(char(id.comm)'))\ncase 'FVER'\n\tid.fsize=fread(fid,1,'int32');\n\tid.timesta=fread(fid,1,'uint32');\n\tif id.timesta ~= 2726318400\n\t\tdisp(['I cannot recognize timestump ' num2str(id.timesta)]);\n\tend;\n\t[id.comm,na]=fread(fid,4,'uchar');\n\tif na==0\n\t\tif isempty(x); disp('End of file reached!');fclose(fid);return;end;\n\tend;\ncase 'COMM'\n\tid.commsz=fread(fid,1,'int32');\n\tid.commnch=fread(fid,1,'int16');\n\tid.commdsz=fread(fid,1,'uint32');\n\tid.samplesize=fread(fid,1,'int16');\n\tid.srex1=fread(fid,1,'uint16');\n\tid.srex2=fread(fid,1,'uint64');\n\tif strcmp(char(id.formtp),['A';'I';'F';'C'])\n\t    id.compress=fread(fid,4,'char');\n\t\tif ~strcmp(char(id.compress),['N';'O';'N';'E'])\n\t\t    disp('Compression is not supported.');\n\t\t\treturn;\n\t\tend;\n\t    fread(fid,id.commsz-22,'char');\n\tend;\n\tfs=2^(id.srex1-16383)*id.srex2/hex2dec('8000000000000000');\n    [id.comm,na]=fread(fid,4,'uchar');\n\tif na==0\n\t\tif isempty(x); disp('End of file reached!');fclose(fid);return;end;\n\tend;\ncase 'SSND'\n\tid.ckdatasize=fread(fid,1,'uint32');\n\tid.offset=fread(fid,1,'int32');\n\tid.blksz=fread(fid,1,'int32');\n\tswitch(id.samplesize)\n\tcase 8\n\t    x=fread(fid,id.ckdatasize-8,'int8');\n\t\tx=reshape(x,id.commnch,id.commsz)';\n\tcase 16\n\t    x=fread(fid,(id.ckdatasize-8)/2,'int16');\n\t\tx=reshape(x,id.commnch,id.commdsz)';\n\tcase 24\n\t    x=fread(fid,(id.ckdatasize-8)/3,'bit24');\n\t\tx=reshape(x,id.commnch,id.commdsz)';\n\tend;\n    [id.comm,na]=fread(fid,4,'uchar');\n\tif na==0\n\t\tif isempty(x); disp('End of file reached!');fclose(fid);return;end;\n\tend;\notherwise\n\tid.fsize=fread(fid,1,'int32');\n\tif feof(fid) || id.fsize > id.formcksz || id.fsize <=0\n\t\tfclose(fid);\n\t\treturn;\n\tend;\n\tid.skip=fread(fid,id.fsize,'char');\n    [id.comm,na]=fread(fid,4,'uchar');\n\tif na==0\n\t\tif isempty(x); disp('End of file reached!');fclose(fid);return;end;\n\tend;\nend;\nend;\n%id\nfclose(fid);\n\n"
  },
  {
    "path": "src/aiffwrite.m",
    "content": "function ok=aiffwrite(x,fs,nbits,fname)\n\n%\tfunction ok=aiffwrite(x,fs,nbits,fname)\n%\tWrite AIFF file\n%\tThis is a reduced version and does not fulfill the\n%\tAIFF standard.\n\n%\tCoded by Hideki Kawahara based on \"Audio Interchange file format AIFF-C draft\"\n%\t\tby Apple Computer inc. 8/26/91\n%\t14/Feb./1998\n%\t14/Jan./1999 bug fix for Windows\n\nok=1;\n[nr,nc]=size(x);\nif nc>nr\n    ok=[];\n\tdisp('Data must be a set of column vector.');\n\treturn;\nend;\nnex=floor(log(fs)/log(2));\nvv=fs/2^(nex+1)*2^(4*16);\nnex2=nex+16383;\n\nfid=fopen(fname,'w','ieee-be.l64');\nfwrite(fid,'FORM','char');\ncksize=46+nr*nc*(nbits/8);\nfwrite(fid,cksize,'int32');\nfwrite(fid,'AIFF','char');\n\nfwrite(fid,'COMM','char');\nfwrite(fid,18,'int32');\nfwrite(fid,nc,'int16');\nfwrite(fid,nr,'int32');\nfwrite(fid,nbits,'int16');\nfwrite(fid,nex2,'uint16');\nfwrite(fid,vv,'uint64');\n\nfwrite(fid,'SSND','char');\nfwrite(fid,nr*nc*(nbits/8)+8,'int32');\nfwrite(fid,0,'int32');\nfwrite(fid,0,'int32');\ny=x';\nswitch(nbits)\n   case 8\n       fwrite(fid,y(:),'int8');\n   case 16\n       fwrite(fid,y(:),'int16');\n   case 24\n       fwrite(fid,y(:),'bit24');\nend;\nfclose(fid);\n\n"
  },
  {
    "path": "src/aperiodiccomp.m",
    "content": "function ap=aperiodiccomp(apv,dpv,ashift,f0,nshift,imgi)\n%\tap=aperiodiccomp(apv,dpv,ashift,f0,nshift,fftl,imgi);\n%\tCalculate aperiodicity index \n%\tInput parameters\n%\t\tapv, dpv : Upper and lower envelope\n%\t\tashift\t\t: shift step for aperiodicity index calculation (ms)\n%\t\tf0\t\t\t: fundamental frequency (Hz)\n%\t\tnshift\t\t: shift step for f0 information (ms)\n%\t\tfftl\t\t: FFT size\n%\t\timgi\t\t: display indicator, 1: display on (default) 0: off\n\n%   modified to add the waitbar on 08/Dec./2002\n%\tmodified by Takahashi 10/Aug./2005\n%\tmodified by Kawahara 10/Sept./2005\n\nif nargin==5; imgi=1; end;\n%[nn,mm]=size(nsgram);\nmm=length(f0);\n%%nn=fftl/2+1;\n[~,m2]=size(apv);\n\nx=(0:m2-1)'*ashift;\nxi=(0:mm-1)'*nshift;\nxi=min(max(x),xi);\n\nif imgi==1; hpg=waitbar(0.1,'Interpolating periodicity information'); end;\nif imgi==1; drawnow; end;\n%ap=interp1q(x,(dpv-apv)',xi)';%,'*linear')';\nap = interp1(x, (dpv-apv)',xi, 'linear', 'extrap')';\nif imgi==1; close(hpg); end;\n\n"
  },
  {
    "path": "src/aperiodicpartERB2.m",
    "content": "function [apv,dpv,apve,dpve]=aperiodicpartERB2(x,fs,f0,shiftm,intshiftm,mm,imgi)\n%\tRelative aperiodic energy estimation with ERB smoothing\n%\t\t[apv,dpv,apve,dpve]=aperiodicpartERB2(x,fs,f0,shiftm,intshiftm,mm,imgi)\n%\t\tx\t: input speech\n%\t\tfs\t: sampling frequency (Hz)\n%\t\tf0\t: fundamental frequency (Hz)\n%\t\tshiftm\t: frame shift (ms) for input F0 data\n%\t\tintshiftm \t: frame shift (ms) for internal processing\n%\t\tmm\t: length of frequency axis (usually 2^N+1)\n%\t\timgi\t: display indicator, 1: display on (default) 0: off\n\n%\t19/August/1999\n%\t21/August/1999\n%\t30/May/2001\n%\t10/April/2002 completely rewrote\n%   07/Dec./2002 waitbar was added\n%   13/Jan./2005 bug fix\n%   08/April/2005 safe guard\n%\t10/Aug./2005 modified by Takahashi on wait bar\n%\t10/Sept./2005 modified by Kawahara on wait bar\n%   16/Sept./2005 minor bug fix\n\nif nargin==6; imgi=1; end; % 10/Sept./2005\nif imgi==1; hpg=waitbar(0,'ERB-based multiband periodicity calculation'); end;\nf0(isnan(f0)>0)=zeros(size(f0(isnan(f0)>0))); % safe guard\nlowerF0limit = 40; % safe guard 16/Sept./2005\n\nfftl=2.0^ceil(log2(6.7*fs/lowerF0limit)+1);  % FFT size selection to be scalable\nif ~isempty(f0(f0>0));avf0=mean(f0(f0>0));else avf0=180;end; % 08/April/2005\n%%f0bk=f0;\nf0(f0==0)=f0(f0==0)+avf0;\nf0(f0<lowerF0limit)=f0(f0<lowerF0limit)*0+lowerF0limit;% safe guard 16/Sept./2005\nf0=f0(:);\nf0i=interp1((0:length(f0)+2)*(shiftm/1000),[f0;f0(end)*ones(3,1)],(0:length(x)-1)/fs);\nphr=cumsum(2*pi*f0*shiftm/1000);\nphri=interp1((0:length(phr)-1),phr,(0:length(x)-1)/(length(x)-1)*(length(phr)-1));\nif imgi==1; waitbar(0.05); end; % 08/Dec./2002%10/Aug./2005\nphc=phr(1):2*pi*40/fs:phr(end);\nxi=interp1(phri,x,phc);\nf0ii=interp1(phri,f0i,phc);\nt0=(0:length(x)-1)/fs;\nti=interp1(phri,t0,phc);\nif imgi==1; waitbar(0.1); end; % 08/Dec./2002 %10/Aug./2005\ntidx=interp1(ti,(0:length(ti)-1),0:(intshiftm/1000):ti(end))+1;\nfxa=(0:mm-1)/(mm-1)*fs/2;\nfxfi=(0:fftl/2)'/fftl*fs;\n\nbias=fftl;\nxii=[zeros(fftl,1);xi(:);zeros(fftl,1)];\nxii=xii+randn(length(xii),1)*max(abs(xii))/100000;  % safeguard\n%----- window design for 40 Hz ------\n\ntt=((1:fftl)-fftl/2)/fs;\nw=exp(-pi*(tt*40/1).^2);  % 40/0.2 to 40/2 worked reasonably. But, WATCH fftl !!\nwb=max(0,1-abs(tt*40/2));\nwb=wb(wb>0);\nwcc=fftfilt(wb,[zeros(1,fftl),w,zeros(1,fftl)]);\nwcc=wcc/max(wcc);\n[~,mxp]=max(wcc);\nwcc=wcc-wcc(1);\nwcc=wcc/sum(wcc);\nww=wcc(round((1:fftl)-fftl/2+mxp))';\nbb=(1:fftl)-fftl/2;\n\n%----- spectrum smoother design\nfff=[2:fftl 1];\nffb=[fftl 1:fftl-1];\n%----- lifter design\nqx=(0:fftl-1)/fs;\nlft=1.0./(1+exp((qx-1.4/40)*1000))';\nlft(fftl:-1:fftl/2)=lft(2:fftl/2+2);\n%------ preparation for EREB smoothing\n\nevv=(0:1024)/1024*HzToErbRate(fs/2); % ERB axis for smoothing\neew=1; % effective smoothing width in ERB\nlh=round(2*eew/evv(2)); % number of samples for 2*eew on evv axis\nwe=hanning(lh)/sum(hanning(lh)); % Hanning window is used for smoothing\nbx=(1:length(evv)); % index for extraction\nhvv=228.8*(10.0.^(0.0467*evv)-1); % frequency axis represented in Hz\nhvv(1)=0; hvv(end)=fs/2; % safeguard\n\nevx=(0:0.5:max(evv));\n\nbss=(1:fftl/2-1);\nbss2=1:fftl/2;\n\napv=zeros(mm,length(tidx));\ndpv=zeros(mm,length(tidx));\napve=zeros(length(evx),length(tidx));\ndpve=apve;\n\nfor ii=1:length(tidx);\n\tidp=round(tidx(ii))+bias;\n\tsw=abs(fft(xii(idp+bb).*ww));\n\tsws=(sw*2+sw(ffb)+sw(fff))/4;\n\tsms=real(ifft(real(fft(log(sws))).*lft))/log(10)*20; %smoothed dB spectrum\n\tplits=[0; (((diff(sms(bss2)).*diff(sms(bss2+1)))<0).*sms(bss).*(diff(sms(bss2))>0))];\n\tdlits=[0; (((diff(sms(bss2)).*diff(sms(bss2+1)))<0).*sms(bss).*(diff(sms(bss2))<0))];\n\tgg=fxfi(abs(plits)>0);\n\tgfg=(sms(abs(plits)>0));\n\tdd=fxfi(abs(dlits)>0);\n\tdfd=(sms(abs(dlits)>0));\n\tgga=[0;gg;fs/2]*f0ii(round(tidx(ii)))/40;\n\tdda=[0;dd;fs/2]*f0ii(round(tidx(ii)))/40;\n\tdfda=[dfd(1) ;dfd ;dfd(end)]; % dip level (dB)\n\tgfga=[gfg(1); gfg ;gfg(end)]; % peak level (dB)\n\tdfdap=10.0.^(dfda/10); % dip level (power)\n\tgfgap=10.0.^(gfga/10); % peak level (power)\n\tape=interp1(HzToErbRate(gga),gfgap,evv); % Upper power envelope on ERB\n\tdpe=interp1(HzToErbRate(dda),dfdap,evv); % Lower power envelope on ERB\n\n\tapef=[ape(lh:-1:2) ape ape(end-1:-1:end-lh)]; % ape with mirrored ends\n\tdpef=[dpe(lh:-1:2) dpe dpe(end-1:-1:end-lh)]; % dpe with mirrored ends\n\n\tapefs=fftfilt(we,apef); % smoothed ape\n\tdpefs=fftfilt(we,dpef); % smoothed dpe\n\n\tapefs=apefs(bx+lh-1+round(lh/2)); \n\tdpefs=dpefs(bx+lh-1+round(lh/2));\n\tapr=interp1(hvv,apefs,fxa); % smoothed ape on linear axis\n\tdpr=interp1(hvv,dpefs,fxa); % smoothed dpe on linear axis\n\tdpv(:,ii)=dpr';\n\tapv(:,ii)=apr';\n\tdpve(:,ii)=interp1(evv,dpefs,evx)';\n\tapve(:,ii)=interp1(evv,apefs,evx)';\n  if imgi==1 && rem(ii,2)==0 %10/Aug./2005\n     waitbar(0.1+0.9*ii/length(tidx)); %,hpg);\n  end;\nend;\nif imgi==1; fprintf('\\n'); end;%10/Aug./2005\nif imgi==1; close(hpg); end;%10/Aug./2005\n"
  },
  {
    "path": "src/boundmes2.m",
    "content": "function bv=boundmes2(apv,dpv,fs,shiftm,intshiftm,mm)\n%\tboundary calculation for MBE model\n%\t\tbv=boundmes2(apv,dpv,fs,shiftm,intshiftm,mm);\n%\t\tapv\t\t: peak envelope\n%\t\tdpv\t\t: dip envelope\n%\t\tfs\t\t: sampling frequency (Hz)\n%\t\tshiftm\t: frame shift of F0 data\n%\t\tintshiftm\t: frame shift for envelope data\n%\t\tmm\t\t: number of elements in frequency axis\n\n%\t01/Sept./1999\n%\tby Hideki Kawahara\n\nlx=log10((1:mm-1)/(mm-1)/2*fs);\nfx=(1:mm-1)/(mm-1)/2*fs;\nwwv=10.0.^(apv/20);\nlyv=((dpv-apv)/20);\n[~,kk]=size(apv);\nbv=zeros(1,kk);\nfor ii=1:kk\n   bv(ii)=sum((lyv(2:mm,ii)'-lx).*wwv(2:mm,ii)'./fx)/sum(wwv(2:mm,ii)./fx');\nend;\n\n%\tAssuming shiftm >= 1 ms\nif ne(round(shiftm),shiftm)\n   bv=[];\n   return;\nend;\nif ne(round(intshiftm),intshiftm)\n   bv=[];\n   return;\nend;\nif shiftm==intshiftm\n   return;\nend;\nif intshiftm>1\n   bv=interp(bv,intshiftm);\n   if shiftm>1\n      bv=bv(1:shiftm:length(bv));\n   end;\nend;\n\n"
  },
  {
    "path": "src/correctdpv.m",
    "content": "function dpv=correctdpv(apv,dpv,shiftap,f0raw,ecrt,shiftm,fs)\n%   dpv=correctdpv(apv,dpv,shiftap,ecrt,shiftm,fs)\n%   Apperiodicity correction based on C/N estimation\n%   dpv     : lower spectral envelope\n%   apv     : upper spectral envelope\n%   shiftap : frame shift for apv and dpv (ms)\n%   f0raw   : fundamental frequency (Hz)\n%   ecrt    : C/N (absolute value)\n%   shiftm  : frame shift for F0 and spectrum (ms)\n%   fs      : sampling frequency (Hz)\n\n%   Designed and coded by Hideki Kawahara\n%   04/Feb./2003\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n\t\t\n[nn,mm]=size(apv);\nnf0=length(f0raw);\nfx=(0:nn-1)/(nn-1)/2*fs;\nf0raw(f0raw==0)=f0raw(f0raw==0)+40; % safe guard\n\nfor ii=1:mm\n    iif=min(nf0,round((ii-1)*shiftap/shiftm)+1);\n    if ~isnan(ecrt(iif))\n        bdr=1.0./(1+exp(-(fx-2.5*f0raw(iif))/f0raw(iif)*4));\n        bdr=(bdr+1.0/ecrt(iif))/(1+1.0/ecrt(iif));\n        dpv(:,ii)=min(dpv(:,ii),apv(:,ii)+20*log10(bdr(:)));\n    end;\nend;\n\n"
  },
  {
    "path": "src/defaultparamsorg.m",
    "content": "function ok=defaultparamsorg\n%\tfunction to define default parameters.\n%\tPlease copy this file as defaultparams.m and edit\n%\tnecessary parameters.\n%\tIf defaultparams.m exists, definitions in defaultparams.m\n%\toverride original default parameters.\n\n%\t08/Dec./2002 by H.K.\n\nglobal f0floor f0ceil fs framem shiftm f0shiftm ...\n  fftl eta pc framel fftl2 acth pwth pcnv fconv sconv delsp gdbw cornf fname delfracind ...\n  tpath  mag delfrac hr upsampleon defaultch\n\n% paraminitialized\n\n\t  f0floor=40;  % Lower limit of F0 search range\n\t  f0ceil=800;  % Upper limit of F0 search range\n\t  fs=22050;\t% sampling frequency (Hz)\n\t  framem=40;\t% default frame length limit for pitch extraction (ms)\n\t  shiftm=1;       % default frame shift (ms) for spectrogram\n\t  f0shiftm=1;     % default frame shift (ms) for F0 information\n\t  fftl=1024;\t% default FFT length\n\t  eta=1.4;        % time window stretch factor\n\t  pc=0.6;         % exponent for nonlinearity\n\t  mag=0.2;      % This parameter should be revised.\n\t  framel=framem*fs/1000;\n\n\t  if fftl < framel\n\t    fftl=2^ceil(log(framel)/log(2));\n\t  end;\n\t  fftl2=fftl/2;\n\t  defaultch=1; % 17/Feb./2001\n\n\t  %-------------- Decision parameter for source information\n\n\t  acth=0.5;\t% Threshold for normalized correlation (dimension less)\n\t  pwth=32;\t% Threshold for instantaneous power below maximum (dB)\n\t  \n\t  %-----------------------------------------------------\n\t  %       Synthesis parameters\n\t  %-----------------------------------------------------\n\n\t  pcnv=1.0; \t% pitch stretch\n\t  fconv=1.0; \t% frequency stretch\n\t  sconv=1.0; \t% time stretch\n\n%\t  delsp=2; \t%  standard deviation of random group delay in ms\n      delsp=0.5; \t%  standard deviation of random group delay in ms 26/June/2002\n\t  gdbw=70; \t% smoothing window length of random group delay (in Hz)\n%\t  cornf=3000;  \t% corner frequency for random phase (Hz)\n\t  cornf=4000;  \t% corner frequency for random phase (Hz) 26/June 2002\n\t  delfrac=0.2;  % This parameter should be revised.\n\t  delfracind=0;\n\n\t  %-----------------------------------------------------\n\t  %\tfile parameters\n\t  %-----------------------------------------------------\n\n\t  fname='none';\t\t% input data file name\n\n\t  hr='on';\n\t  tpath=pwd; \n\t  if strcmp(computer,'MAC2')==0\n\t\t  tpath=[tpath '/'];\n\t  end;\n\t  upsampleon=0;\nok=1;\nreturn;\n"
  },
  {
    "path": "src/exSinStraightSynth.m",
    "content": "function [sy,prmS] = exSinStraightSynth(f0raw,n3sgram,fs,optionalParamsS)\n%   STRAIGHT synthesis based on sinusoidal plus noise model\n%   [sy,prmS] = exSinStraightSynth(f0raw,n3sgram,ap,fs,optionalParams)\n%   Input \n%       f0raw   : fundamental frequency (Hz)\n%       n3sgram : STRAIGHT spectrogram\n%       fs      : sampling frequency\n%       optionalParamsS  : optional parameters\n%           spectralUpdateInterval : frame rate (ms)\n%           initialPhase    : initial phase of sinusoids (radian)\n%           initialAmplitude    : initial amplitude for defining waveform\n%           lowestF0    : lowest F0 of the synthesized speech (Hz)\n%           minimumPhase    : minimum phase indicator (defult 0)\n%   Output\n%       sy  : synthesized speech waveform\n%       prmS    : parameters used in synthesis\n\n%   Originally coded when visiting CNBH on 2003\n%   Revised by Hideki Kawahara\n%   11/December/2005 by Hideki Kawahara\n\nsy = [];\nswitch nargin\n    case 3\n        prmS = zinitializeParameters(fs);\n    case 4\n        prmS = replaceSuppliedParameters(fs,optionalParamsS);\n    otherwise\n        help exSinStraightSynth\n        fs = 44100;\n        prmS = zinitializeParameters(fs);\n        return;\nend;\nshiftm = prmS.spectralUpdateInterval;\ninitialPhase = prmS.initialPhase;\ninitialAmplitude = prmS.initialAmplitude;\nminimumPhase = prmS.minimumPhase;\n\ncdm = unwrap(zspectrum2minimumphase(n3sgram,fs));\n[amx,fmx,cmx]= sinucompgd(f0raw,fs,n3sgram,cdm,shiftm);\namx(isnan(amx))=0;\ncmx(isnan(cmx))=0;\ndeltaPhase = 2*pi*fmx/fs;\nphaseDeviation = cmx*minimumPhase;\n[~,nFrequency] = size(deltaPhase);\nlPhaseVector = length(initialPhase);\ndeltaPhase(1,:) = initialPhase(min(lPhaseVector,1:nFrequency))+deltaPhase(1,:);\namx = amx*diag(initialAmplitude(min(lPhaseVector,1:nFrequency)));\nsy=sum(real(amx.*exp(1i*(cumsum(deltaPhase)+phaseDeviation))), 2);\nreturn;\n\n%%%---- internal functions\nfunction prmS = zinitializeParameters(fs)\nprmS.spectralUpdateInterval = 1; %shiftm=1;       % default frame shift (ms) for spectrogram\nprmS.lowestF0 = 50; % compatible default is 50 Hz\nprmS.initialPhase = zeros(1,ceil(fs/prmS.lowestF0/2));\nprmS.initialAmplitude = ones(1,ceil(fs/prmS.lowestF0/2));\nprmS.minimumPhase = 0;  % default is zero phase\nprmS.samplingFrequency = fs;\nreturn;\n\n%%%----\nfunction prmS = replaceSuppliedParameters(fs,prmin)\nprmS = zinitializeParameters(fs);\nif isfield(prmin,'spectralUpdateInterval')==1;\n    prmS.spectralUpdateInterval=prmin.spectralUpdateInterval;end;\nif isfield(prmin,'lowestF0')==1;\n    prmS.lowestF0=prmin.lowestF0;end;\nif isfield(prmin,'initialPhase')==1;\n    prmS.initialPhase=prmin.initialPhase;end;\nif isfield(prmin,'initialAmplitude')==1;\n    prmS.initialAmplitude=prmin.initialAmplitude;end;\nif isfield(prmin,'minimumPhase')==1;\n    prmS.minimumPhase=prmin.minimumPhase;end;\nreturn;\n\n%%%----\nfunction [amx,fmx,cmx]= sinucompgd(f0raw,fs,n3sgram,cdm,shiftm)\n\n%   [amx,fmx]=sinucomp(f0raw,fs,n3sgram,shiftm)\n%   program to generate matrix for sinusoidal synthesis\n%\n\n%   Designed and Coded by Hideki Kawahara\n%   07/Sept./2003\n\nt=0:1/fs:(length(f0raw)-1)/1000/shiftm;\nf0i=interp1((0:length(f0raw)-1)/1000/shiftm,f0raw,t)';\nf0l=min(f0raw(f0raw>0));\nng=n3sgram';\nng(:,1) = ng(:,1)*0;\n[~,mm]=size(ng);\n\n%  ---- instantaneous frequency matrix ---\nnh=ceil(fs/2/f0l);\nnt=length(f0i);\nfmx=zeros(nt,nh);\ntmx=fmx;\nfor ii=0:nh-1\n    fmx(:,ii+1)=ii*f0i;\n    tmx(:,ii+1)=t';\nend;\n\n% ---- instantaneous amplitude matrix ---\n[ff,tt]=meshgrid((0:(mm-1))*fs/((mm-1)*2),(0:(length(f0raw)-1))/1000/shiftm);\namx=interp2(ff,tt,ng,fmx,tmx,'*linear');\ncmx=interp2(ff,ff,cdm',fmx,fmx,'*linear');\nreturn;\n\n%%%--- \nfunction cph=zspectrum2minimumphase(n3sgram,~)\n%   cph=spectrum2minimumphase(n3sgram,fs)\n%   function to calculate minimum phase map from \n%   smoothed time frequency representation\n\n%   Designed and coded by Hideki Kawahara\n%   7/Sept./2003\n%   11/Dec./2005 revised\n\n[nRow,nColumn]=size(n3sgram);\nfftl=(nRow-1)*2;\n\nreversedIndex=fftl/2:-1:2;\ncph=zeros(nRow,nColumn);\nfor ii=1:nColumn\n    dftSegment=[n3sgram(:,ii);n3sgram(reversedIndex,ii)];\n    complexCepstrum=real(fft(log(dftSegment))); \n    causalCepstrum=[complexCepstrum(1);2*complexCepstrum(2:fftl/2);0*complexCepstrum(fftl/2+1:fftl)];\n    causalLogSpectrum=ifft(causalCepstrum);\n    cph(:,ii)=-imag(causalLogSpectrum(1:fftl/2+1));\nend;\n"
  },
  {
    "path": "src/exSinStraightSynthBU.m",
    "content": "function sy = exSinStraightSynth(f0raw,fs,n3sgram,shiftm)\n\ngdm=gdmap(n3sgram,fs);\n[amx,fmx,gmx]= sinucompgd(f0raw,fs,n3sgram,gdm,shiftm);\namx(isnan(amx))=0;\nsy=sum(amx'.*cos(cumsum(2*pi*fmx/fs))');\n\nfunction [amx,fmx,gmx]= sinucompgd(f0raw,fs,n3sgram,gdm,shiftm)\n\n%   [amx,fmx]=sinucomp(f0raw,fs,n3sgram,shiftm)\n%   program to generate matrix for sinusoidal synthesis\n%\n\n%   Designed and Coded by Hideki Kawahara\n%   07/Sept./2003\n\nt=0:1/fs:(length(f0raw)-1)/1000/shiftm;\nf0i=interp1((0:length(f0raw)-1)/1000/shiftm,f0raw,t)';\nf0l=min(f0raw(f0raw>0));\nng=n3sgram';\nng(:,1) = ng(:,1)*0;\ngd=gdm';\n[nn,mm]=size(ng);\n\n%  ---- instantaneous frequency matrix ---\nnh=ceil(fs/2/f0l);\nnt=length(f0i);\nfmx=zeros(nt,nh);\ntmx=fmx;\nfor ii=1:nh\n    fmx(:,ii)=ii*f0i;\n    tmx(:,ii)=t';\nend;\n\n% ---- instantaneous amplitude matrix ---\namx=zeros(nt,nh);\n[ff,tt]=meshgrid((0:(mm-1))*fs/((mm-1)*2),(0:(length(f0raw)-1))/1000/shiftm);\n%keyboard;\namx=interp2(ff,tt,ng,fmx,tmx);\ngmx=interp2(ff,tt,gd,fmx,tmx);\n\nfunction gdm=gdmap(n3sgram,fs)\n%   gdm=gdmap(n3sgram,fs)\n%   function to calculate group delay map from \n%   smoothed time frequency representation\n\n%   Designed and coded by Hideki Kawahara\n%   7/Sept./2003\n\n[nn,mm]=size(n3sgram);\nfftl=(nn-1)*2;\n\nrbb2=fftl/2:-1:2;\ngdm=zeros(nn,mm);\nfor ii=1:mm\n    ff=[n3sgram(:,ii);n3sgram(rbb2,ii)];\n    ccp=real(fft(log(ff))); \n    ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n    ffx=(-ifft(ccp2));\n    gdt=-diff(imag(ffx)/(2*pi*fs/fftl));\n    gdm(:,ii)=[gdt(1);gdt(1:fftl/2)];\nend;\n"
  },
  {
    "path": "src/exSinStraightSynthBU2.m",
    "content": "function [sy,prmS] = exSinStraightSynth(f0raw,n3sgram,fs,optionalParamsS)\n%   STRAIGHT synthesis based on sinusoidal plus noise model\n%   [sy,prmS] = exSinStraightSynth(f0raw,n3sgram,ap,fs,optionalParams)\n%   Input \n%       f0raw   : fundamental frequency (Hz)\n%       n3sgram : STRAIGHT spectrogram\n%       fs      : sampling frequency\n%       optionalParamsS  : optional parameters\n%           spectralUpdateInterval : frame rate (ms)\n%           initialPhase    : initial phase of sinusoids (radian)\n%           lowestF0    : lowest F0 of the synthesized speech (Hz)\n%   Output\n%       sy  : synthesized speech waveform\n%       prmS    : parameters used in synthesis\n\n%   Originally coded when visiting CNBH on 2003\n%   Revised by Hideki Kawahara\n%   10/December/2005 by Hideki Kawahara\n\nswitch nargin\n    case 3\n        prmS = zinitializeParameters(fs);\n    case 4\n        prmS = replaceSuppliedParameters(fs,optionalParamsS);\nend;\nshiftm = prmS.spectralUpdateInterval;\ninitialPhase = prmS.initialPhase;\ninitialAmplitude = prmS.initialAmplitude;\nlowestF0 = prmS.lowestF0; % compatible default is 50 Hz\nminimumPhase = prmS.minimumPhase;\n\n%[groupDelayMap,cdm]=spectrum2GroupDelay(n3sgram,fs);\ncdm =spectrum2minimumphase(n3sgram,fs);\n[amx,fmx,cmx]= sinucompgd(f0raw,fs,n3sgram,cdm,shiftm);\namx(isnan(amx))=0;\n%gmx(isnan(gmx))=0;\ncmx(isnan(cmx))=0;\ndeltaPhase = 2*pi*fmx/fs;\n%phaseDeviation = -2*pi*gmx.*fmx*minimumPhase;\nphaseDeviation = cmx*minimumPhase;\n[nTime,nFrequency] = size(deltaPhase);\nlPhaseVector = length(initialPhase);\ndeltaPhase(1,:) = initialPhase(min(lPhaseVector,1:nFrequency))+deltaPhase(1,:);\namx = amx*diag(initialAmplitude(min(lPhaseVector,1:nFrequency)));\nsy=sum(real(amx.*exp(i*(cumsum(deltaPhase)+phaseDeviation)))');\n\n%%%---- internal functions\nfunction prmS = zinitializeParameters(fs);\nprmS.spectralUpdateInterval = 1; %shiftm=1;       % default frame shift (ms) for spectrogram\nprmS.lowestF0 = 50; % compatible default is 50 Hz\nprmS.initialPhase = zeros(1,ceil(fs/prmS.lowestF0/2));\nprmS.initialAmplitude = ones(1,ceil(fs/prmS.lowestF0/2));\nprmS.minimumPhase = 0;  % default is zero phase\nreturn;\n\n%%%----\nfunction prmS = replaceSuppliedParameters(fs,prmin);\nprmS = zinitializeParameters(fs);\nif isfield(prmin,'spectralUpdateInterval')==1;\n    prmS.spectralUpdateInterval=prmin.spectralUpdateInterval;end;\nif isfield(prmin,'lowestF0')==1;\n    prmS.lowestF0=prmin.lowestF0;end;\nif isfield(prmin,'initialPhase')==1;\n    prmS.initialPhase=prmin.initialPhase;end;\nif isfield(prmin,'initialAmplitude')==1;\n    prmS.initialAmplitude=prmin.initialAmplitude;end;\nif isfield(prmin,'minimumPhase')==1;\n    prmS.minimumPhase=prmin.minimumPhase;end;\nreturn;\n\n%%%----\nfunction [amx,fmx,cmx]= sinucompgd(f0raw,fs,n3sgram,cdm,shiftm)\n\n%   [amx,fmx]=sinucomp(f0raw,fs,n3sgram,shiftm)\n%   program to generate matrix for sinusoidal synthesis\n%\n\n%   Designed and Coded by Hideki Kawahara\n%   07/Sept./2003\n\nt=0:1/fs:(length(f0raw)-1)/1000/shiftm;\nf0i=interp1((0:length(f0raw)-1)/1000/shiftm,f0raw,t)';\nf0l=min(f0raw(f0raw>0));\nng=n3sgram';\nng(:,1) = ng(:,1)*0;\n%gd=gdm';\n[nn,mm]=size(ng);\n\n%  ---- instantaneous frequency matrix ---\nnh=ceil(fs/2/f0l);\nnt=length(f0i);\nfmx=zeros(nt,nh);\ntmx=fmx;\nfor ii=0:nh-1\n    fmx(:,ii+1)=ii*f0i;\n    tmx(:,ii+1)=t';\nend;\n\n% ---- instantaneous amplitude matrix ---\namx=zeros(nt,nh);\n[ff,tt]=meshgrid((0:(mm-1))*fs/((mm-1)*2),(0:(length(f0raw)-1))/1000/shiftm);\n%keyboard;\namx=interp2(ff,tt,ng,fmx,tmx,'*linear');\n%gmx=interp2(ff,tt,gd,fmx,tmx,'*linear');\ncmx=interp2(ff,ff,cdm',fmx,fmx,'*linear');\nreturn;\n\n%%%--- \nfunction cph=spectrum2minimumphase(n3sgram,fs)\n%   gdm=spectrum2GroupDelay(n3sgram,fs)\n%   function to calculate group delay map from \n%   smoothed time frequency representation\n\n%   Designed and coded by Hideki Kawahara\n%   7/Sept./2003\n\n[nRow,nColumn]=size(n3sgram);\nfftl=(nRow-1)*2;\n\nreversedIndex=fftl/2:-1:2;\n%gdm=zeros(nRow,nColumn);\ncph=zeros(nRow,nColumn);\nfor ii=1:nColumn\n    dftSegment=[n3sgram(:,ii);n3sgram(reversedIndex,ii)];\n    complexCepstrum=real(fft(log(dftSegment))); \n    causalCepstrum=[complexCepstrum(1);2*complexCepstrum(2:fftl/2);0*complexCepstrum(fftl/2+1:fftl)];\n    causalLogSpectrum=ifft(causalCepstrum);\n%    rawGroupDelay=-diff(-imag(causalLogSpectrum)/(2*pi*fs/fftl));\n%    gdm(:,ii)=[rawGroupDelay(1);rawGroupDelay(1:fftl/2)];\n    cph(:,ii)=-imag(causalLogSpectrum(1:fftl/2+1));\nend;\n"
  },
  {
    "path": "src/exstraightAPind.m",
    "content": "function [ap,analysisParams]=exstraightAPind(x,fs,f0,optionalParams)\n%   Aperiodicity index extraction for STRAIGHT\n%   [ap,analysisParams]=exstraightAPind(x,fs,f0,optionalParams)\n%   Input parameters\n%   x   : input signal. if it is multi channel, only the first channel is used\n%   fs  : sampling frequency (Hz)\n%   f0  : fundamental frequency (Hz)\n%   optionalParams : Optional parameters for analysis\n%   Output parameters\n%   ap  : amount of aperiodic component in the time frequency represntation\n%       : represented in dB\n%   analysisParams : Analysis parameters actually used\n%\n%   Usage:\n%   Case 1: The simplest method\n%   ap=exstraightAPind(x,fs,f0); \n%   Case 2: You can get to know what parameters were used.\n%   [ap,analysisParams]=exstraightAPind(x,fs,f0);\n%   CAse 3: You can have full control of STRAIGHT synthesis.\n%       Please use case 2 to find desired parameters to modify.\n%   [ap,analysisParams]=exstraightAPind(x,fs,f0,optionalParams);\n\n%   Notes on programing style\n%   This routine is based on the current (2005.1.31) implementation of\n%   STRAIGHT that consist of many legacy fragments. They were intentionally\n%   kept for maintaining historic record. Revised functions written in a\n%   reasonable stylistic practice will be made available soon.\n\n%   Designed and coded by Hideki Kawahara\n%   15/January/2005\n%   01/February/2005 extended for user control\n%   13/March/2005 Aperiodicity index extraction part is isolated\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n%   11/Sept./2005 waitbar control is fixed.\n%   05/July/2006 default values are modified, framem\n\t\t\n%---Check for number of input parameters\nswitch nargin\n    case 3\n        prm=zinitializeParameters;\n    case 4\n        prm=replaceSuppliedParameters(optionalParams);\n    otherwise\n        disp('Number of arguments is 3 or 4!');\n        return;\nend\n\n%   Initialize default parameters\nf0ceil = prm.F0searchUpperBound; % f0ceil\nframem = prm.F0defaultWindowLength; % default frame length for pitch extraction (ms)\nf0shiftm = prm.F0frameUpdateInterval; % shiftm % F0 calculation interval (ms)\n\nfftl=1024;\t% default FFT length\n\nframel=framem*fs/1000;\n\nif fftl < framel\n    fftl=2^ceil(log(framel)/log(2));\nend;\n\n[nr,nc]=size(x);\nif nr>nc\n    x=x(:,1);\nelse\n    x=x(1,:)';\nend;\n\nimageOn = prm.DisplayPlots; % imgi=1; % image display indicator (1: display image)\n\n% paramaters for F0 refinement\nfftlf0r = prm.refineFftLength; %fftlf0r=1024; % FFT length for F0 refinement\ntstretch = prm.refineTimeStretchingFactor; %tstretch=1.1; % time window stretching factor\nnhmx = prm.refineNumberofHarmonicComponent; %nhmx=3; % number of harmonic components for F0 refinement\niPeriodicityInterval = prm.periodicityFrameUpdateInterval; % frame update interval for periodicity index (ms)\n\n%---- F0 refinement \nnstp=1; % start position of F0 refinement (samples)\nnedp=length(f0); % last position of F0 refinement (samples)\ndn=floor(fs/(f0ceil*3*2)); % fix by H.K. at 28/Jan./2003\n[f0raw,ecr]=refineF06(decimate(x,dn),fs/dn,f0,fftlf0r,tstretch,nhmx,f0shiftm,nstp,nedp,imageOn); % 31/Aug./2004\n\necrt=ecr;\necrt(f0raw==0)=ecrt(f0raw==0)*NaN;\n\n%----- aperiodicity estimation\nf0raw=f0;\n[apvq,dpvq,~,~]=aperiodicpartERB2(x,fs,f0raw,f0shiftm,iPeriodicityInterval,fftl/2+1,imageOn); % 10/April/2002\napv=10*log10(apvq); % for compatibility\ndpv=10*log10(dpvq); % for compatibility\n\n%- ---------\n%   Notes on aperiodicity estimation: The previous implementation of\n%   aperiodicity estimation was sensitive to low frequency noise. It is a\n%   bad news, because environmental noise usually has its power in the low\n%   frequency region. The following corrction uses the C/N information\n%   which is the byproduct of fixed point based F0 estimation.\n%   by H.K. 04/Feb./2003\n%- ---------\ndpv=correctdpv(apv,dpv,iPeriodicityInterval,f0raw,ecrt,f0shiftm,fs); % Aperiodicity correction 04/Feb./2003 by H.K.\n\nif imageOn\n    bv=boundmes2(apv,dpv,fs,f0shiftm,iPeriodicityInterval,fftl/2+1);\n    figure;\n    semilogy((0:length(bv)-1)*f0shiftm,0.5./10.0.^(bv));grid on;\n    set(gcf,'PaperPosition', [0.634517 0.634517 19.715 28.4084]);\nend;\n\nap=aperiodiccomp(apv,dpv,iPeriodicityInterval,f0raw,f0shiftm,imageOn); % 11/Sept./2005\n\nswitch nargout\n    case 1\n    case 2\n        analysisParams=prm;\n    otherwise\n        disp('Number of output parameters has to be 1 or 2!')\nend;\nend\n\n%%%---- internal functions\n\n%%%------\nfunction prm=zinitializeParameters\nprm.F0searchLowerBound=40; % f0floor\nprm.F0searchUpperBound=800; % f0ceil\nprm.F0defaultWindowLength = 80; % default frame length for pitch extraction (ms)\nprm.F0frameUpdateInterval=1; % shiftm % F0 calculation interval (ms)\nprm.NofChannelsInOctave=24; % nvo=24; % Number of channels in one octave\nprm.IFWindowStretch=1.2; % mu=1.2; % window stretch from isometric window\nprm.DisplayPlots=0; % imgi=1; % image display indicator (1: display image)\nprm.IFsmoothingLengthRelToFc=1; %  smp=1; % smoothing length relative to fc (ratio)\nprm.IFminimumSmoothingLength=5; %  minm=5; % minimum smoothing length (ms)\nprm.IFexponentForNonlinearSum=0.5; % pc=0.5; % exponent to represent nonlinear summation\nprm.IFnumberOfHarmonicForInitialEstimate=1; % nc=1; % number of harmonic component to use (1,2,3)\nprm.refineFftLength=1024; %fftlf0r=1024; % FFT length for F0 refinement\nprm.refineTimeStretchingFactor=1.1; %tstretch=1.1; % time window stretching factor\nprm.refineNumberofHarmonicComponent=3; %nhmx=3; % number of harmonic components for F0 refinement\nprm.periodicityFrameUpdateInterval=5; % frame update interval for periodicity index (ms)return\nprm.note=' '; % Any text to be printed on the source information plot\nend\n\n%%%--------\nfunction prm=replaceSuppliedParameters(prmin)\nprm=zinitializeParameters;\nif isfield(prmin,'F0searchLowerBound')==1;\n    prm.F0searchLowerBound=prmin.F0searchLowerBound;end;\nif isfield(prmin,'F0searchUpperBound')==1;\n    prm.F0searchUpperBound=prmin.F0searchUpperBound;end;\nif isfield(prmin,'F0defaultWindowLength')==1;\n    prm.F0defaultWindowLength=prmin.F0defaultWindowLength;end;\nif isfield(prmin,'F0frameUpdateInterval')==1;\n    prm.F0frameUpdateInterval=prmin.F0frameUpdateInterval;end;\nif isfield(prmin,'NofChannelsInOctave')==1;\n    prm.NofChannelsInOctave=prmin.NofChannelsInOctave;end;\nif isfield(prmin,'IFWindowStretch')==1;\n    prm.IFWindowStretch=prmin.IFWindowStretch;end;\nif isfield(prmin,'DisplayPlots')==1;\n    prm.DisplayPlots=prmin.DisplayPlots;end;\nif isfield(prmin,'IFsmoothingLengthRelToFc')==1;\n    prm.IFsmoothingLengthRelToFc=prmin.IFsmoothingLengthRelToFc;end;\nif isfield(prmin,'IFminimumSmoothingLength')==1;\n    prm.IFminimumSmoothingLength=prmin.IFminimumSmoothingLength;end;\nif isfield(prmin,'IFexponentForNonlinearSum')==1;\n    prm.IFexponentForNonlinearSum=prmin.IFexponentForNonlinearSum;end;\nif isfield(prmin,'IFnumberOfHarmonicForInitialEstimate')==1;\n    prm.IFnumberOfHarmonicForInitialEstimate=prmin.IFnumberOfHarmonicForInitialEstimate;end;\nif isfield(prmin,'refineFftLength')==1;\n    prm.refineFftLength=prmin.refineFftLength;end;\nif isfield(prmin,'refineTimeStretchingFactor')==1;\n    prm.refineTimeStretchingFactor=prmin.refineTimeStretchingFactor;end;\nif isfield(prmin,'refineNumberofHarmonicComponent')==1;\n    prm.refineNumberofHarmonicComponent=prmin.refineNumberofHarmonicComponent;end;\nif isfield(prmin,'periodicityFrameUpdateInterval')==1;\n    prm.periodicityFrameUpdateInterval=prmin.periodicityFrameUpdateInterval;end;\nif isfield(prmin,'note')==1;\n    prm.note=prmin.note;end;\nend\n"
  },
  {
    "path": "src/exstraightsource.m",
    "content": "function [f0raw,ap,analysisParams]=exstraightsource(x,fs,optionalParams)\n%   Source information extraction for STRAIGHT\n%   [f0raw,ap,analysisParams]=exstraightsource(x,fs,optionalParams)\n%   Input parameters\n%   x   : input signal. if it is multi channel, only the first channel is used\n%   fs  : sampling frequency (Hz)\n%   optionalParams : Optional parameters for analysis\n%   Output parameters\n%   f0raw   : fundamental frequency (Hz)\n%   ap  : amount of aperiodic component in the time frequency represntation\n%       : represented in dB\n%   analysisParams : Analysis parameters actually used\n%\n%   Usage:\n%   Case 1: The simplest method\n%   [f0raw,ap]=exstraightsource(x,fs); \n%   Case 2: You can get to know what parameters were used.\n%   [f0raw,ap,analysisParams]=exstraightsource(x,fs);\n%   CAse 3: You can have full control of STRAIGHT synthesis.\n%       Please use case 2 to find desired parameters to modify.\n%   [f0raw,ap,analysisParams]=exstraightsource(x,fs,optionalParams);\n\n%   Notes on programing style\n%   This routine is based on the current (2005.1.31) implementation of\n%   STRAIGHT that consist of many legacy fragments. They were intentionally\n%   kept for maintaining historic record. Revised functions written in a\n%   reasonable stylistic practice will be made available soon.\n\n%   Designed and coded by Hideki Kawahara\n%   15/January/2005\n%   01/February/2005 extended for user control\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n\t\t\n%---Check for number of input parameters\nswitch nargin\n    case 2\n        prm=zinitializeParameters;\n    case 3\n        prm=replaceSuppliedParameters(optionalParams);\n    otherwise\n        disp('Number of arguments is 2 or 3!');\n        return;\nend\n\n%   Initialize default parameters\nf0floor = prm.F0searchLowerBound; % f0floor\nf0ceil = prm.F0searchUpperBound; % f0ceil\nframem = prm.F0defaultWindowLength; % default frame length for pitch extraction (ms)\nf0shiftm = prm.F0frameUpdateInterval; % shiftm % F0 calculation interval (ms)\n\nfftl=1024;\t% default FFT length\n\nframel=framem*fs/1000;\n\nif fftl < framel\n    fftl=2^ceil(log(framel)/log(2));\nend;\n\n[nr,nc]=size(x);\nif nr>nc\n    x=x(:,1);\nelse\n    x=x(1,:)';\nend;\n\nnvo = prm.NofChannelsInOctave; % nvo=24; % Number of channels in one octave\nmu = prm.IFWindowStretch; % mu=1.2; % window stretch from isometric window\nimageOn = prm.DisplayPlots; % imgi=1; % image display indicator (1: display image)\nsmp = prm.IFsmoothingLengthRelToFc; %  smp=1; % smoothing length relative to fc (ratio)\nminsm = prm.IFminimumSmoothingLength; %  minm=5; % minimum smoothing length (ms)\npcf0 = prm.IFexponentForNonlinearSum; % pc=0.5; % exponent to represent nonlinear summation\nnh = prm.IFnumberOfHarmonicForInitialEstimate; % nc=1; % number of harmonic component to use (1,2,3)\nfname= prm.note; %=' '; % Any text to be printed on the source information plot\n\nnvc=ceil(log(f0ceil/f0floor)/log(2)*nvo); % number of channels\n\n% paramaters for F0 refinement\nfftlf0r = prm.refineFftLength; %fftlf0r=1024; % FFT length for F0 refinement\ntstretch = prm.refineTimeStretchingFactor; %tstretch=1.1; % time window stretching factor\nnhmx = prm.refineNumberofHarmonicComponent; %nhmx=3; % number of harmonic components for F0 refinement\niPeriodicityInterval = prm.periodicityFrameUpdateInterval; % frame update interval for periodicity index (ms)\n\n%---- F0 extraction based on a fixed-point method in the frequency domain\n\n[f0v,vrv,dfv,~,aav]=fixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imageOn,f0shiftm,smp,minsm,pcf0,nh);\nif imageOn\n    title([fname '  ' datestr(now,0)]);\n    drawnow;\nend;\n\n%---- post processing for V/UV decision and F0 tracking\n[pwt,pwh]=zplotcpower(x,fs,f0shiftm,imageOn);\n\n[f0raw,irms,~,~]=f0track5(f0v,vrv,dfv,pwt,pwh,aav,f0shiftm,imageOn); % 11/Sept./2005\nf0t=f0raw;avf0=mean(f0raw(f0raw>0));\nf0t(f0t==0)=f0t(f0t==0)*NaN;tt=1:length(f0t);\n\nif imageOn\n    subplot(615);plot(tt*f0shiftm,f0t,'g');grid on;\n    if ~isnan(avf0)\n        axis([1 max(tt)*f0shiftm ...\n                min(avf0/sqrt(2),0.95*min(f0raw(f0raw>0)))  ...\n                max(avf0*sqrt(2),1.05*max(f0raw(f0raw>0)))]);\n    end;\n    ylabel('F0 (Hz)');\n    hold on;\nend;\n\n%---- F0 refinement \nnstp=1; % start position of F0 refinement (samples)\nnedp=length(f0raw); % last position of F0 refinement (samples)\ndn=floor(fs/(f0ceil*3*2)); % fix by H.K. at 28/Jan./2003\n[f0raw,ecr]=refineF06(decimate(x,dn),fs/dn,f0raw,fftlf0r,tstretch,nhmx,f0shiftm,nstp,nedp,imageOn); % 31/Aug./2004% 11/Sept.2005\n\nif imageOn\n    f0t=f0raw;\n    f0t(f0t==0)=f0t(f0t==0)*NaN;tt=1:length(f0t);\n    subplot(615);plot(tt*f0shiftm,f0t,'k');hold off;\n    drawnow \nend;\n%----------- 31/July/1999\necrt=ecr;\necrt(f0raw==0)=ecrt(f0raw==0)*NaN;\n\nif imageOn\n    tirms=irms;\n    tirms(f0raw==0)=tirms(f0raw==0)*NaN;\n    tirms(f0raw>0)=-20*log10(tirms(f0raw>0));\n    subplot(616);hrms=plot(tt*f0shiftm,tirms,'g',tt*f0shiftm,20*log10(ecrt),'r'); %31/July/1999\n    set(hrms,'LineWidth',2);hold on\n    plot(tt*f0shiftm,-10*log10(vrv),'k.');\n    grid on;hold off\n    axis([1 max(tt)*f0shiftm -10 60]);\n    xlabel('time (ms)');ylabel('C/N (dB)');\n    drawnow;\nend;\n\n%-------------------------------------------------------------------------------------\nf0raw(f0raw<=0)=f0raw(f0raw<=0)*0; % safeguard 31/August/2004\nf0raw(f0raw>f0ceil)=f0raw(f0raw>f0ceil)*0+f0ceil; % safeguard 31/August/2004\n\nif nargout == 1; return; end;\n\n%----- aperiodicity estimation\n[apvq,dpvq,~,~]=aperiodicpartERB2(x,fs,f0raw,f0shiftm,iPeriodicityInterval,fftl/2+1,imageOn); % 10/April/2002$11/Sept./2005\napv=10*log10(apvq); % for compatibility\ndpv=10*log10(dpvq); % for compatibility\n%- ---------\n%   Notes on aperiodicity estimation: The previous implementation of\n%   aperiodicity estimation was sensitive to low frequency noise. It is a\n%   bad news, because environmental noise usually has its power in the low\n%   frequency region. The following corrction uses the C/N information\n%   which is the byproduct of fixed point based F0 estimation.\n%   by H.K. 04/Feb./2003\n%- ---------\ndpv=correctdpv(apv,dpv,iPeriodicityInterval,f0raw,ecrt,f0shiftm,fs); % Aperiodicity correction 04/Feb./2003 by H.K.\n\nif imageOn\n    bv=boundmes2(apv,dpv,fs,f0shiftm,iPeriodicityInterval,fftl/2+1);\n    figure;\n    semilogy((0:length(bv)-1)*f0shiftm,0.5./10.0.^(bv));grid on;\n    set(gcf,'PaperPosition', [0.634517 0.634517 19.715 28.4084]);\nend;\n\nap=aperiodiccomp(apv,dpv,iPeriodicityInterval,f0raw,f0shiftm,imageOn); % 11/Sept./2005\n\nswitch nargout\n    case 2\n    case 3\n        analysisParams=prm;\n    otherwise\n        disp('Number of output parameters has to be 2 or 3!')\nend;\n\nend\n\n%%%---- internal functions\nfunction [pw,pwh]=zplotcpower(x,fs,shiftm,imageOn)\n\nflm=8;  % 01/August/1999 \nfl=round(flm*fs/1000);\nw=hanning(2*fl+1);\nw=w/sum(w);\nnn=length(x);\n\nflpm=40;\nflp=round(flpm*fs/1000);\nwlp=fir1(flp*2,70/(fs/2));\nwlp(flp+1)=wlp(flp+1)-1;\nwlp=-wlp;\n\ntx=[x(:)' zeros(1,2*length(wlp))];\nttx=fftfilt(wlp,tx);\nttx=ttx((1:nn)+flp);\ntx=[ttx(:)' zeros(1,2*length(w))];\n\npw=fftfilt(w,tx.^2);\npw=pw((1:nn)+fl);\nmpw=max(pw);\npw=pw(round(1:shiftm*fs/1000:nn));\npw(pw<mpw/10000000)=pw(pw<mpw/10000000)+mpw/10000000; % safeguard 15/Jan./2003\n\nb=fir1(2*fl+1,[0.0001 3000/(fs/2)]);\nb(fl+1)=b(fl+1)-1;\nxh=fftfilt(b,tx);\nxh=xh((1:nn)+fl);\ntx=[xh(:)' zeros(1,10*length(w))];\npwh=fftfilt(w,tx.^2);\npwh=pwh((1:nn)+fl);\npwh=pwh(round(1:shiftm*fs/1000:nn)); \npwh(pwh<mpw/10000000)=pwh(pwh<mpw/10000000)+mpw/10000000;% safeguard 15/Jan./2003\n\nif imageOn\n    subplot(614);\n    tt=1:length(pw);\n    hhg=plot(tt*shiftm,10*log10(pw),'b');hold on;\n    plot(tt*shiftm,10*log10(pwh),'r');grid on;hold off;\n    set(hhg,'LineWidth',2);\n    mp=max(10*log10(pw));\n    axis([0 max(tt)*shiftm mp-70 mp+5]);\n    ylabel('level (dB)');\n    title('thick line: total power thin line:high fq. power (>3kHz) ');\nend;\nend\n\n%%%------\nfunction prm=zinitializeParameters\nprm.F0searchLowerBound=40; % f0floor\nprm.F0searchUpperBound=800; % f0ceil\nprm.F0defaultWindowLength = 80; % default frame length for pitch extraction (ms)\nprm.F0frameUpdateInterval=1; % shiftm % F0 calculation interval (ms)\nprm.NofChannelsInOctave=24; % nvo=24; % Number of channels in one octave\nprm.IFWindowStretch=1.2; % mu=1.2; % window stretch from isometric window\nprm.DisplayPlots=0; % imgi=1; % image display indicator (1: display image)\nprm.IFsmoothingLengthRelToFc=1; %  smp=1; % smoothing length relative to fc (ratio)\nprm.IFminimumSmoothingLength=5; %  minm=5; % minimum smoothing length (ms)\nprm.IFexponentForNonlinearSum=0.5; % pc=0.5; % exponent to represent nonlinear summation\nprm.IFnumberOfHarmonicForInitialEstimate=1; % nc=1; % number of harmonic component to use (1,2,3)\nprm.refineFftLength=1024; %fftlf0r=1024; % FFT length for F0 refinement\nprm.refineTimeStretchingFactor=1.1; %tstretch=1.1; % time window stretching factor\nprm.refineNumberofHarmonicComponent=3; %nhmx=3; % number of harmonic components for F0 refinement\nprm.periodicityFrameUpdateInterval=5; % frame update interval for periodicity index (ms)return\nprm.note=' '; % Any text to be printed on the source information plot\nend\n\n%%%--------\nfunction prm=replaceSuppliedParameters(prmin)\nprm=zinitializeParameters;\nif isfield(prmin,'F0searchLowerBound')==1;\n    prm.F0searchLowerBound=prmin.F0searchLowerBound;end;\nif isfield(prmin,'F0searchUpperBound')==1;\n    prm.F0searchUpperBound=prmin.F0searchUpperBound;end;\nif isfield(prmin,'F0defaultWindowLength')==1;\n    prm.F0defaultWindowLength=prmin.F0defaultWindowLength;end;\nif isfield(prmin,'F0frameUpdateInterval')==1;\n    prm.F0frameUpdateInterval=prmin.F0frameUpdateInterval;end;\nif isfield(prmin,'NofChannelsInOctave')==1;\n    prm.NofChannelsInOctave=prmin.NofChannelsInOctave;end;\nif isfield(prmin,'IFWindowStretch')==1;\n    prm.IFWindowStretch=prmin.IFWindowStretch;end;\nif isfield(prmin,'DisplayPlots')==1;\n    prm.DisplayPlots=prmin.DisplayPlots;end;\nif isfield(prmin,'IFsmoothingLengthRelToFc')==1;\n    prm.IFsmoothingLengthRelToFc=prmin.IFsmoothingLengthRelToFc;end;\nif isfield(prmin,'IFminimumSmoothingLength')==1;\n    prm.IFminimumSmoothingLength=prmin.IFminimumSmoothingLength;end;\nif isfield(prmin,'IFexponentForNonlinearSum')==1;\n    prm.IFexponentForNonlinearSum=prmin.IFexponentForNonlinearSum;end;\nif isfield(prmin,'IFnumberOfHarmonicForInitialEstimate')==1;\n    prm.IFnumberOfHarmonicForInitialEstimate=prmin.IFnumberOfHarmonicForInitialEstimate;end;\nif isfield(prmin,'refineFftLength')==1;\n    prm.refineFftLength=prmin.refineFftLength;end;\nif isfield(prmin,'refineTimeStretchingFactor')==1;\n    prm.refineTimeStretchingFactor=prmin.refineTimeStretchingFactor;end;\nif isfield(prmin,'refineNumberofHarmonicComponent')==1;\n    prm.refineNumberofHarmonicComponent=prmin.refineNumberofHarmonicComponent;end;\nif isfield(prmin,'periodicityFrameUpdateInterval')==1;\n    prm.periodicityFrameUpdateInterval=prmin.periodicityFrameUpdateInterval;end;\nif isfield(prmin,'note')==1;\n    prm.note=prmin.note;end;\nend\n"
  },
  {
    "path": "src/exstraightspec.m",
    "content": "function [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParamsSP)\n%   Spectral information extraction for STRAIGHT\n%   [n3sgram,nalysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParamsSP)\n%   Input parameters\n%   x   : input signal. only the first channel is analyzed\n%   f0raw   : fundamental frequency (Hz) in 1 ms temporal resolution\n%           : set 0 for aperiodic part\n%   fs  : sampling freuency (Hz)\n%   optionalParamsSP : spectrum analysis parameters\n%   Output parameters\n%   n3sgram : Smoothed time frequency representation (spectrogram)\n%   analysisParamsSp :  Actually used parameters\n%\n%   Usage:\n%   Case 1: The simplest method\n%   n3sgram = exstraightspec(x,f0raw,fs); \n%   Case 2: You can get to know what parameters were used.\n%   [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs);\n%   CAse 3: You can have full control of STRAIGHT synthesis.\n%       Please use case 2 to find desired parameters to modify.\n%   [n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParamsSP);\n\n\n%   Designed and coded by Hideki Kawahara\n%   15/January/2005\n%   01/February/2005\n%   11/Sept./2005 waitbar control is fixed.\n%   05/July/2006 default values are modified, eta, framem\n\n%---Check for number of input parameters\nswitch nargin\n    case 3\n        prm=zinitializeParameters;\n    case 4\n        prm=replaceSuppliedParameters(optionalParamsSP);\n    otherwise\n        disp('Number of arguments is 2 or 3!');\n        return;\nend\n\n%   Initialize parameters\nimageOn = prm.DisplayPlots; %imageOn=0; % Display indicator. 0: No graphics, 1: Show graphics\nframem = prm.defaultFrameLength; %framem=40;\t% default frame length for pitch extraction (ms)\nshiftm = prm.spectralUpdateInterval; %shiftm=1;       % default frame shift (ms) for spectrogram\neta = prm.spectralTimeWindowStretch; %eta=1.4;        % time window stretch factor\npc = prm.spectralExponentForNonlinearity; %pc=0.6;         % exponent for nonlinearity\nmag = prm.spectralTimeDomainCompensation; %mag=0.2;      % This parameter should be revised.\nframel=framem*fs/1000;\nfftl=1024;\t% default FFT length\n\nif fftl < framel\n    fftl=2^ceil(log(framel)/log(2));\nend;\n[nr,nc]=size(x);\nif nr>nc\n    xold=x(:,1);\nelse\n    xold=x(1,:)';\nend;\n\n%---- Spectral estimation\n\nxamp=std(xold);\nscaleconst=2200; % magic number for compatibility 15/Jan./2005\nxold=xold/xamp*scaleconst;\nf0var=1; f0varL=1; % These are obsolate dummy variables. meaningless\n[n2sgrambk,~]=straightBodyC03ma(xold,fs,shiftm,fftl,f0raw,f0var,f0varL,eta,pc,imageOn); % 11/Sept./2005\nif mag>0\n    n3sgram=specreshape(fs,n2sgrambk,eta,pc,mag,f0raw,imageOn); % 11/Sept./2005\nelse\n    n3sgram=n2sgrambk;\nend;\nn3sgram=n3sgram/scaleconst*xamp;\nanalysisParamsSp = prm;\nreturn;\n\n%%%--- Internal functions\nfunction prm=zinitializeParameters\nprm.DisplayPlots = 0; %imageOn=0; % Display indicator. 0: No graphics, 1: Show graphics\nprm.defaultFrameLength = 80; %framem=40;\t% default frame length for pitch extraction (ms)\nprm.spectralUpdateInterval = 1; %shiftm=1;       % default frame shift (ms) for spectrogram\nprm.spectralTimeWindowStretch = 1.0; %eta=1.4;        % time window stretch factor\nprm.spectralExponentForNonlinearity = 0.6; %pc=0.6;         % exponent for nonlinearity\nprm.spectralTimeDomainCompensation = 0.2; %mag=0.2;      % This parameter should be revised.\n\n%%%----\nfunction prm=replaceSuppliedParameters(prmin)\nprm=zinitializeParameters;\nif isfield(prmin,'DisplayPlots')==1;\n    prm.DisplayPlots=prmin.DisplayPlots;end;\nif isfield(prmin,'defaultFrameLength')==1;\n    prm.defaultFrameLength=prmin.defaultFrameLength;end;\nif isfield(prmin,'spectralUpdateInterval')==1;\n    prm.spectralUpdateInterval=prmin.spectralUpdateInterval;end;\nif isfield(prmin,'spectralTimeWindowStretch')==1;\n    prm.spectralTimeWindowStretch=prmin.spectralTimeWindowStretch;end;\nif isfield(prmin,'spectralExponentForNonlinearity')==1;\n    prm.spectralExponentForNonlinearity=prmin.spectralExponentForNonlinearity;end;\nif isfield(prmin,'spectralTimeDomainCompensation')==1;\n    prm.spectralTimeDomainCompensation=prmin.spectralTimeDomainCompensation;end;\nreturn;"
  },
  {
    "path": "src/exstraightsynth.m",
    "content": "function [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs,optionalParamsS)\n%   Synthesis using STRAIGHT parameters with linear modifications\n%   [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs,optionalParamsS)\n%   Input parameters\n%   f0raw   : fundamental frequency (Hz) \n%   n3sgram : STRAIGHT spectrogram (in absolute value)\n%   ap      : aperiodic component (dB re. to total power)\n%   fs      : sampling frequency (Hz)\n%   optionalParamsS : optional synthesis parameters\n%   Output parameters\n%   sy      : synthesized speech\n%   prmS    : Actually used synthesis parameters\n%\n%   Usage:\n%   Case 1: The simplest method\n%   sy = exstraightsynth(f0raw,n3sgram,ap,fs); \n%   Case 2: You can get to know what parameters were used.\n%   [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs);\n%   CAse 3: You can have full control of STRAIGHT synthesis.\n%       Please use case 2 to find desired parameters to modify.\n%   [sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs,optionalParamsS);\n\n%   Designed and coded by Hideki Kawahara\n%   15/January/2005\n%   01/February/2005 revised for generalization\n%   14/February/2005 fixed typo\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n%   11/Sept./2005 display indicator field is defined.\n%   27/Nov./2005 enabled setting lower limit of F0\n% 03/July/2015 refactord for MATLAB R2016a and Octave\n\t\t\n%---- Check input parameters\nswitch nargin\n    case 4\n        prmS=zinitializeParameters;\n    case 5\n        prmS=replaceSuppliedParameters(optionalParamsS);\n    otherwise\n        disp('Number of arguments is not relevant. Type help exstraightsynth.');\n        return\nend;\n\n%--- Initialize parameters\nshiftm = prmS.spectralUpdateInterval; %shiftm=1;       % default frame shift (ms) for spectrogram\ndelsp = prmS.groupDelayStandardDeviation; %delsp=0.5; \t%  standard deviation of random group delay in ms\ngdbw = prmS.groupDelaySpatialBandWidth; %gdbw=70; \t% smoothing window length of random group delay (in Hz)\ncornf = prmS.groupDelayRandomizeCornerFrequency; %cornf=4000;  \t% corner frequency for random phase (Hz)\ndelfrac = prmS.ratioToFundamentalPeriod; %delfrac=0.2;  % Fractional group delay (ratio) \ndelfracind = prmS.ratioModeIndicator; %delfracind=0; % Use fractional group dealy, if this is set 1.\nnormalizedOut = prmS.levelNormalizationIndicator; %normalizedOut = 1; % Normalize voiced part level, when this is set 1.\nheadRoom = prmS.headRoomToClip; %headRoom = 22; % Head room from voiced part rms to the clipping level. (dB)\nlsegment = prmS.powerCheckSegmentLength; %lsegment = 15; % Segment length for voiced power check (ms)\nimap = prmS.timeAxisMappingTable; % imap = 1 represents identity mapping.\npconv = prmS.fundamentalFrequencyMappingTable; %pconv = 1 represents identity mapping.\nfconv = prmS.frequencyAxisMappingTable; %fconv = 1 represents identity mapping.\nsconv = prmS.timeAxisStretchingFactor; %sconv = 1; % This is a simple coefficient.\nimgi = prmS.DisplayPlots; % default 0, 1: display on\nlowestF0 = prmS.lowestF0; % compatible default is 50 Hz\n\n[sy,statusReport] =straightSynthTB07ca(n3sgram,f0raw,shiftm,fs, ...\n    pconv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind,ap,imap,imgi,lowestF0); % revised 27/Nov./2005\nif normalizedOut\n    dBsy=zpowerchk(sy,fs,lsegment); % 23/Sept./1999\n    cf=(20*log10(32768)-headRoom)-dBsy;\n    sy=sy*(10.0.^(cf/20));\nend;\nprmS.statusReport = statusReport;\nend\n\n%%%----- Internal functions\nfunction pow=zpowerchk(x,fs,segms)\n%\tCalculate average power of voiced portion\n%\tpow=powerchk(x,fs,segms)\n%\t\tx\t: signal\n%\t\tfs\t: sampling frequency (Hz)\n%\t\tsegms\t: segment length (ms)\n\n%\t23/Sept./1999 updated\n\nx1=x(:);\niv=(1:length(x1))';\nx1(isnan(x1))=iv(isnan(x1))*0+0.0000000001;\nx2=x1.*x1;\nn=round(segms/1000*fs); % 23/Sept./1999\nnw=ceil(length(x)/n);\nif rem(length(x),n)>0\n  x2=[x2;0.000001*randn(n*nw-length(x),1).^2]; % 23/Sept./1999\nend;\nx2(x2==0)=x2(x2==0)+0.000001;\n\npw=sum(reshape(x2,n,nw))/n;\n\npow=10*log10(mean(pw(pw>(mean(pw)/30))));\nend\n\n%%%---- Initialize parameters\nfunction prm=zinitializeParameters\nprm.spectralUpdateInterval = 1; %shiftm=1;       % default frame shift (ms) for spectrogram\nprm.groupDelayStandardDeviation = 0.5; %delsp=0.5; \t%  standard deviation of random group delay in ms\nprm.groupDelaySpatialBandWidth = 70; %gdbw=70; \t% smoothing window length of random group delay (in Hz)\nprm.groupDelayRandomizeCornerFrequency = 4000; %cornf=4000;  \t% corner frequency for random phase (Hz)\nprm.ratioToFundamentalPeriod = 0.2; %delfrac=0.2;  % Fractional group delay (ratio) \nprm.ratioModeIndicator = 0; %delfracind=0; % Use fractional group dealy, if this is set 1.\nprm.levelNormalizationIndicator = 1; %normalizedOut = 1; % Normalize voiced part level, when this is set 1.\nprm.headRoomToClip = 22; %headRoom = 22; % Head room from voiced part rms to the clipping level. (dB)\nprm.powerCheckSegmentLength = 15; %lsegment = 15; % Segment length for voiced power check (ms)\nprm.timeAxisMappingTable = 1; % imap = 1 represents identity mapping.\nprm.fundamentalFrequencyMappingTable = 1; %pconv = 1 represents identity mapping.\nprm.frequencyAxisMappingTable = 1; %fconv = 1 represents identity mapping.\nprm.timeAxisStretchingFactor = 1; %sconv = 1; % This is a simple coefficient.\nprm.DisplayPlots = 0; % default 0, 1:disply on\nprm.lowestF0 = 50; % default that was not as same as the previous version but consistent\nend\n\n%%%----\nfunction prm=replaceSuppliedParameters(prmin)\nprm=zinitializeParameters;\nif isfield(prmin,'spectralUpdateInterval')==1;\n    prm.spectralUpdateInterval=prmin.spectralUpdateInterval;end;\nif isfield(prmin,'groupDelayStandardDeviation')==1;\n    prm.groupDelayStandardDeviation=prmin.groupDelayStandardDeviation;end;\nif isfield(prmin,'groupDelaySpatialBandWidth')==1;\n    prm.groupDelaySpatialBandWidth=prmin.groupDelaySpatialBandWidth;end;\nif isfield(prmin,'groupDelayRandomizeCornerFrequency')==1;\n    prm.groupDelayRandomizeCornerFrequency=prmin.groupDelayRandomizeCornerFrequency;end;\nif isfield(prmin,'ratioToFundamentalPeriod')==1;\n    prm.ratioToFundamentalPeriod=prmin.ratioToFundamentalPeriod;end;\nif isfield(prmin,'ratioModeIndicator')==1;\n    prm.ratioModeIndicator=prmin.ratioModeIndicator;end;\nif isfield(prmin,'levelNormalizationIndicator')==1;\n    prm.levelNormalizationIndicator=prmin.levelNormalizationIndicator;end;\nif isfield(prmin,'headRoomToClip')==1;\n    prm.headRoomToClip=prmin.headRoomToClip;end;\nif isfield(prmin,'powerCheckSegmentLength')==1;\n    prm.powerCheckSegmentLength=prmin.powerCheckSegmentLength;end;\nif isfield(prmin,'timeAxisMappingTable')==1;\n    prm.timeAxisMappingTable=prmin.timeAxisMappingTable;end;\nif isfield(prmin,'fundamentalFrequencyMappingTable')==1;\n    prm.fundamentalFrequencyMappingTable=prmin.fundamentalFrequencyMappingTable;end;\nif isfield(prmin,'frequencyAxisMappingTable')==1;\n    prm.frequencyAxisMappingTable=prmin.frequencyAxisMappingTable;end;\nif isfield(prmin,'timeAxisStretchingFactor')==1;\n    prm.timeAxisStretchingFactor=prmin.timeAxisStretchingFactor;end;\nif isfield(prmin,'DisplayPlots')==1;\n    prm.DisplayPlots=prmin.DisplayPlots;end;\nif isfield(prmin,'lowestF0')==1;\n    prm.lowestF0=prmin.lowestF0;end;\nend"
  },
  {
    "path": "src/f0track5.m",
    "content": "function [f0,irms,df,amp]=f0track5(f0v,vrv,dfv,pwt,pwh,aav,shiftm,imgi)\n\n%\tF0 trajectory tracker\n%\t[f0,irms,df,amp]=f0track2(f0v,vrv,dfv,shiftm,imgi)\n%\t\tf0\t: extracted F0 (Hz)\n%\t\tirms\t: relative interfering energy in rms\n%\n%\tf0v\t: fixed point frequency vector\n%\tvrv\t: relative interfering energy vector\n%\tdfv\t: fixed point slope vector\n%\tpwt\t: total power\n%\tpwh\t: power in higher frequency range\n%\taav\t: amplitude list for fixed points\n%\tshiftm\t: frame update period (ms)\n%\timgi\t: display indicator, 1: display on (default), 0: off\n%\t\n%\tThis is a very primitive and conventional algorithm.\n\n%\tcoded by Hideki Kawahara\n%\tcopyright(c) Wakayama University/CREST/ATR\n%\t10/April/1999 first version\n%\t17/May/1999 relative fq jump thresholding\n%\t01/August/1999 parameter tweeking\n%   07/Dec./2002 waitbar was added\n%   13/Jan./2005 bug fix on lines 58, 97 (Thanx Ishikasa-san)\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n%\t10/Aug./2005 modified  by Takahashi on waitbar\n%\t10/Sept./2005 modified by Kawahara on waitbar\n\nif nargin==7; imgi=1; end; %10/Sept./2005\nvrv=sqrt(vrv);\n[~,mm]=size(vrv);\nmm=min(mm,length(pwt));\n\nf0=zeros(1,mm);\nirms=ones(1,mm);\ndf=ones(1,mm);\namp=zeros(1,mm);\nvon=0;\n[mxvr,ixx]=min(vrv);\nhth=0.12;\t% highly confident voiced threshould (updated on 01/August/1999)\nlth=0.9;\t% threshold to loose confidence\nbklm=100;\t% back track length for voicing decision\nlalm=10;\t% look ahead length for silence decision\nbkls=bklm/shiftm;\nlals=lalm/shiftm;\nhtr=10*log10(pwh./pwt);\n\nthf0j=0.04*sqrt(shiftm); %  4 % of F0 is the limit of jump\nii=1;\nf0ref=0;\nhtrth=-2.0; % was -3 mod 2002.6.3\nif imgi==1; hpg=waitbar(0,'F0 tracking'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nwhile ii < mm+1\n\tif (von == 0) && (mxvr(ii)<hth) && (htr(ii)<htrth)\n\t\tvon = 1;\n\t\tf0ref=f0v(ixx(ii),ii); % start value for search\n\t\tfor jj=ii:-1:max(1,ii-bkls)\n\t\t\t[gomi,jxx]=min(abs((f0v(:,jj)-f0ref)/f0ref));\n\t\t\tgomi=gomi+(f0ref>10000)+(f0v(jxx,jj)>10000);\n\t\t\tif (((gomi>thf0j) || (vrv(jxx,jj)>lth) || (htr(jj)>htrth))&&(f0v(jxx,jj)<1000)) && htr(jj)>-18\n%\t\t\t\tdisp(['break pt1 at ' num2str(jj)])\n\t\t\t\tbreak\n\t\t\tend;\n\t\t\tif (gomi>thf0j)\n%\t\t\t\tdisp(['break pt2 at ' num2str(jj)])\n\t\t\t\tbreak\n\t\t\tend;\n\t\t\t\n\t\t\tf0(jj)=f0v(jxx,jj);\n\t\t\tirms(jj)=vrv(jxx,jj);\n\t\t\tdf(jj)=dfv(jxx,jj);\n\t\t\tamp(jj)=aav(jxx,jj);\n\t\t\tf0ref=f0(jj);\n\t\tend;\n\t\tf0ref=f0v(ixx(ii),ii);\n\tend;\n\tif (f0ref>0) && (f0ref<10000)\n\t\t[gomi,jxx]=min(abs((f0v(:,ii)-f0ref)/f0ref));\n\telse\n\t\tgomi=10;\n\tend;\n\tif (von ==1) && (mxvr(ii)>hth)\n\t\tfor jj=ii:min(mm,ii+lals)\n\t\t\tii=jj;\n\t\t\t[gomi,jxx]=min(abs((f0v(:,ii)-f0ref)/f0ref));\n\t\t\tgomi=gomi+(f0ref>10000)+(f0v(jxx,ii)>10000);\n\t\t\tif (gomi< thf0j) && ((htr(ii)<htrth)||(f0v(jxx,ii)>=1000))\n\t\t\t\tf0(ii)=f0v(jxx,ii);\n\t\t\t\tirms(ii)=vrv(jxx,ii);\n\t\t\t\tdf(ii)=dfv(jxx,ii);\n\t\t\t\tamp(ii)=aav(jxx,ii);\n\t\t\t\tf0ref=f0(ii);\n\t\t\tend;\n\t\t\tif (gomi>thf0j) || (vrv(jxx,ii)>lth) || ((htr(ii)>htrth)&&(f0v(jxx,ii)<1000))\n\t\t\t\tvon = 0;f0ref=0;\n\t\t\t\tbreak\n\t\t\tend;\n\t\tend;\n\telseif (von==1) && (gomi < thf0j)  && ((htr(ii)<htrth)||(f0v(jxx,ii)>=1000))\n\t\tf0(ii)=f0v(jxx,ii);\n\t\tirms(ii)=vrv(jxx,ii);\n\t\tdf(ii)=dfv(jxx,ii);\n\t\tamp(ii)=aav(jxx,ii);\n\t\tf0ref=f0(ii);\n\telse\n\t\tvon=0;\n\tend;\n    if imgi==1; waitbar(ii/mm); end; %,hpg); % 07/Dec./2002 by H.K.%10/Aug./2005\n\tii=ii+1;\nend;\nif imgi==1; close(hpg); end;%10/Aug./2005\n"
  },
  {
    "path": "src/fixpF0VexMltpBG4.m",
    "content": "function [f0v,vrv,dfv,nf,aav]=fixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pc,nc)\n\n%\tFixed point analysis to extract F0\n%\t[f0v,vrv,dfv,nf]=fixpF0VexMltpBG4(x,fs,f0floor,nvc,nvo,mu,imgi,shiftm,smp,minm,pc,nc)\n%\tx\t: input signal\n%\tfs\t: sampling frequency (Hz)\n%\tf0floor\t: lowest frequency for F0 search\n%\tnvc\t: total number of filter channels\n%\tnvo\t: number of channels per octave\n%\tmu\t: temporal stretching factor\n%\timgi\t: image display indicator (1: display image, default)\n%\tshiftm\t: frame shift in ms\n%\tsmp\t: smoothing length relative to fc (ratio)\n%\tminm\t: minimum smoothing length (ms)\n%\tpc\t: exponent to represent nonlinear summation\n%\tnc\t: number of harmonic component to use (1,2,3)\n\n%\tDesigned and coded by Hideki Kawahara\n%\t28/March/1999\n%\t04/April/1999 revised to multi component version\n%\t07/April/1999 bi-reciprocal smoothing for multi component compensation\n%\t01/May/1999 first derivative of Amplitude is taken into account\n%\t17/Dec./2000 display bug fix\n%\t19/Sep./2002 bug fix (mu information was discarded.)\n%   07/Dec./2002 waitbar was added\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n%\t10/Aug./2005 modified by Takahashi on waitbar\n%\t10/Sept./2005 mofidied by Kawahara on waitbar\n%   11/Sept./2005 fixed waitbar problem\n\t\t\n%f0floor=40;\n%nvo=12;\n%nvc=52;\n%mu=1.1;\n\nx=cleaninglownoise(x,fs,f0floor);\n\nfxx=f0floor*2.0.^((0:nvc-1)/nvo)';\nfxh=max(fxx);\n\ndn=max(1,floor(fs/(fxh*6.3)));\n\nif nc>2\n\tpm3=multanalytFineCSPB(decimate(x,dn),fs/dn,f0floor,nvc,nvo,mu,3,imgi); % error crrect 2002.9.19 (mu was fixed 1.1)\n\tpif3=zwvlt2ifq(pm3,fs/dn);\n\t[~,mm]=size(pif3);\n\tpif3=pif3(:,1:3:mm);\n\tpm3=pm3(:,1:3:mm);\nend;\n\nif nc>1\n\tpm2=multanalytFineCSPB(decimate(x,dn),fs/dn,f0floor,nvc,nvo,mu,2,imgi);% error crrect 2002.9.19(mu was fixed 1.1)\n\tpif2=zwvlt2ifq(pm2,fs/dn);\n\t[~,mm]=size(pif2);\n\tpif2=pif2(:,1:3:mm);\n\tpm2=pm2(:,1:3:mm);\nend;\n\npm1=multanalytFineCSPB(decimate(x,dn*3),fs/(dn*3),f0floor,nvc,nvo,mu,1,imgi);% error crrect 2002.9.19(mu was fixed 1.1)\n%%%% safe guard added on 15/Jan./2003\nmxpm1=max(max(abs(pm1)));\neeps=mxpm1/10000000;\npm1(pm1==0)=pm1(pm1==0)+eeps;\n%%%% safe guard end\npif1=zwvlt2ifq(pm1,fs/(dn*3));\n%keyboard;\n\n[~,mm1]=size(pif1);\nmm=mm1;\nif nc>1\n\t[~,mm2]=size(pif2);\n\tmm=min(mm1,mm2);\nend;\n\nif nc>2\n\t[~,mm3]=size(pif3);\n\tmm=min([mm1 mm2 mm3]);\nend;\n\nif nc == 2\n\tfor ii=1:mm\n\t\tpif2(:,ii)=(pif1(:,ii).*(abs(pm1(:,ii))).^pc ...\n\t\t\t+pif2(:,ii)/2.*(abs(pm2(:,ii))).^pc )...\n\t\t\t./((abs(pm1(:,ii))).^pc+(abs(pm2(:,ii))).^pc);\n\tend;\nend;\nif nc == 3 \n\tfor ii=1:mm\n\t\tpif2(:,ii)=(pif1(:,ii).*(abs(pm1(:,ii))).^pc ...\n\t\t\t+pif2(:,ii)/2.*(abs(pm2(:,ii))).^pc ...\n\t\t\t+pif3(:,ii)/3.*(abs(pm3(:,ii))).^pc )... \n\t\t\t./((abs(pm1(:,ii))).^pc+(abs(pm2(:,ii))).^pc+(abs(pm3(:,ii))).^pc);\n\tend;\nend;\nif nc == 1\n\tpif2=pif1;\nend;\n\n\t\t  \n%pif2=zwvlt2ifq(pm,fs/dn)*2*pi;\npif2=pif2*2*pi;\ndn=dn*3;\n\n[slp,~]=zifq2gpm2(pif2,f0floor,nvo);\n[nn,mm]=size(pif2);\ndpif=(pif2(:,2:mm)-pif2(:,1:mm-1))*fs/dn;\ndpif(:,mm)=dpif(:,mm-1);\n[dslp,~]=zifq2gpm2(dpif,f0floor,nvo);\n\ndamp=(abs(pm1(:,2:mm))-abs(pm1(:,1:mm-1)))*fs/dn;\ndamp(:,mm)=damp(:,mm-1);\ndamp=damp./abs(pm1);\n\n%[c1,c2]=znormwght(1000);\nfxx=f0floor*2.0.^((0:nn-1)/nvo)'*2*pi;\nmmp=0*dslp;\n[c1,c2b]=znrmlcf2(1);\nif imgi==1; hpg=waitbar(0,'P/N map calculation'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfor ii=1:nn\n%\t[c1,c2]=znrmlcf2(fxx(ii)/2/pi); % This is OK, but the next Eq is much faster.\n\tc2=c2b*(fxx(ii)/2/pi)^2;\n\tcff=damp(ii,:)/fxx(ii)*2*pi*0;\n\tmmp(ii,:)=(dslp(ii,:)./(1+cff.^2)/sqrt(c2)).^2+(slp(ii,:)./sqrt(1+cff.^2)/sqrt(c1)).^2;\n    if imgi==1; waitbar(ii/nn); end; %,hpg); % 07/Dec./2002 by H.K.%10/Aug./2005\nend;\nif imgi==1; close(hpg); end;%10/Aug./2005\n\nif smp~=0\n\tsmap=zsmoothmapB(mmp,fs/dn,f0floor,nvo,smp,minm,0.4);\nelse\n\tsmap=mmp;\nend;\n\nfixpp=zeros(round(nn/3),mm);\nfixvv=fixpp+100000000;\nfixdf=fixpp+100000000;\nfixav=fixpp+1000000000;\nnf=zeros(1,mm);\nif imgi==1; hpg=waitbar(0,'Fixed pints calculation'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfor ii=1:mm\n\t[ff,vv,df,aa]=zfixpfreq3(fxx,pif2(:,ii),smap(:,ii),dpif(:,ii)/2/pi,pm1(:,ii));\n\tkk=length(ff);\n\tfixpp(1:kk,ii)=ff;\n\tfixvv(1:kk,ii)=vv;\n\tfixdf(1:kk,ii)=df;\n\tfixav(1:kk,ii)=aa;\n\tnf(ii)=kk;\n    if imgi==1 && rem(ii,10)==0; waitbar(ii/mm); end;% 07/Dec./2002 by H.K.%10/Aug./2005\nend;\nif imgi==1; close(hpg); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfixpp(fixpp==0)=fixpp(fixpp==0)+1000000;\n\n%keyboard\n%[vvm,ivv]=min(fixvv);\n%\n%for ii=1:mm\n%\tff00(ii)=fixpp(ivv(ii),ii);\n%\tesgm(ii)=fixvv(ivv(ii),ii);\n%end;\nnp=max(nf);\nf0v=fixpp(1:np,round(1:shiftm/dn*fs/1000:mm))/2/pi;\nvrv=fixvv(1:np,round(1:shiftm/dn*fs/1000:mm));\ndfv=fixdf(1:np,round(1:shiftm/dn*fs/1000:mm));\naav=fixav(1:np,round(1:shiftm/dn*fs/1000:mm));\nnf=nf(round(1:shiftm/dn*fs/1000:mm));\n\nif imgi==1\n\tcnmap(fixpp,smap,fs,dn,nvo,f0floor,shiftm);\nend;\n%ff00=ff00(round(1:shiftm/dn*fs/1000:mm));\n%esgm=sqrt(esgm(round(1:shiftm/dn*fs/1000:mm)));\n%keyboard;\n\nreturn;\n%------------------------------------------------------------------\nfunction okid=cnmap(fixpp,smap,fs,dn,nvo,f0floor,shiftm)\n\n% \tThis function had a bug in map axis.\n%\t17/Dec./2000 bug fix by Hideki Kawahara.\n\ndt=dn/fs;\n[nn,mm]=size(smap);\naa=figure;\nset(aa,'PaperPosition',[0.3 0.25 8 10.9]);\nset(aa,'Position',[30 130 520 680]);\nsubplot(211);\nimagesc([0 (mm-1)*dt*1000],[1 nn],20*log10(smap(:,round(1:shiftm/dn*fs/1000:mm))));axis('xy')\nhold on;\ntx=((1:shiftm/dn*fs/1000:mm)-1)*dt*1000;\nplot(tx,(nvo*log(fixpp(:,round(1:shiftm/dn*fs/1000:mm))/f0floor/2/pi)/log(2)+0.5)','ko');\nplot(tx,(nvo*log(fixpp(:,round(1:shiftm/dn*fs/1000:mm))/f0floor/2/pi)/log(2)+0.5)','w.');\nhold off\nxlabel('time (ms)');\nylabel('channel #');\ncolormap(jet);\n\nokid=1;\nreturn;\n\n%------------------------------------------------------------------\n\n%%function pm=zmultanalytFineCSPm(x,fs,f0floor,nvc,nvo,mu,mlt);\n\n%       Dual waveleta analysis using cardinal spline manipulation\n%               pm=multanalytFineCSP(x,fs,f0floor,nvc,nvo);\n%       Input parameters \n%               \n%               x       : input signal (2kHz sampling rate is sufficient.)\n%               fs      : sampling frequency (Hz)\n%               f0floor : lower bound for pitch search (60Hz suggested)\n%               nvc     : number of total voices for wavelet analysis\n%               nvo     : number of voices in an octave\n%\t\t\t\tmu\t\t: temporal stretch factor\n%       Outpur parameters\n%               pm      : wavelet transform using iso-metric Gabor function\n%\n%       If you have any questions,  mailto:kawahara@hip.atr.co.jp\n%\n%       Copyright (c) ATR Human Information Processing Research Labs. 1996\n%       Invented and coded by Hideki Kawahara\n%       30/Oct./1996\n\n%t0=1/f0floor;\n%lmx=round(6*t0*fs*mu);\n%wl=2^ceil(log(lmx)/log(2));\n%x=x(:)';\n%nx=length(x);\n%tx=[x,zeros(1,wl)];\n%gent=((1:wl)-wl/2)/fs;\n\n%nvc=18;\n\n%wd=zeros(nvc,wl);\n%wd2=zeros(nvc,wl);\n%ym=zeros(nvc,nx);\n%pm=zeros(nvc,nx);\n%mpv=1;\n%mu=1.0;\n%for ii=1:nvc\n%  t=gent*mpv;\n%  t=t(abs(t)<3.5*mu*t0);\n%  wbias=round((length(t)-1)/2);\n%  wd1=exp(-pi*(t/t0/mu).^2);%.*exp(i*2*pi*t/t0); \n%  wd2=max(0,1-abs(t/t0/mu));\n%  wd2=wd2(wd2>0);\n%  wwd=conv(wd2,wd1);\n%  wwd=wwd(abs(wwd)>0.0001);\n%  wbias=round((length(wwd)-1)/2);\n%  wwd=wwd.*exp(i*2*pi*mlt*t(round((1:length(wwd))-wbias+length(t)/2))/t0);\n%  pmtmp1=fftfilt(wwd,tx);\n%  pm(ii,:)=pmtmp1(wbias+1:wbias+nx)*sqrt(mpv);\n%  mpv=mpv*(2.0^(1/nvo));\n%  keyboard;\n%end;\n%[nn,mm]=size(pm);\n%pm=pm(:,1:mlt:mm);\n\n%----------------------------------------------------------------\nfunction pif=zwvlt2ifq(pm,fs)\n%\tWavelet to instantaneous frequency map\n%\tfqv=wvlt2ifq(pm,fs)\n\n%\tCoded by Hideki Kawahara\n%\t02/March/1999\n\n[~,mm]=size(pm);\npm=pm./(abs(pm));\npif=abs(pm(:,:)-[pm(:,1),pm(:,1:mm-1)]);\npif=fs/pi*asin(pif/2);\npif(:,1)=pif(:,2);\n\n%----------------------------------------------------------------\n\nfunction [slp,pbl]=zifq2gpm2(pif,f0floor,nvo)\n%\tInstantaneous frequency 2 geometric parameters\n%\t[slp,pbl]=ifq2gpm(pif,f0floor,nvo)\n%\tslp\t\t: first order coefficient\n%\tpbl\t\t: second order coefficient\n\n%\tCoded by Hideki Kawahara\n%\t02/March/1999\n\n[nn,~]=size(pif);\nfx=f0floor*2.0.^((0:nn-1)/nvo)*2*pi;\n\nc=2.0^(1/nvo);\ng=[1/c/c 1/c 1;1 1 1;c*c c 1];\nh=inv(g);\n\n%slp=pif(1:nn-2,:)*h(1,1)+pif(2:nn-1,:)*h(1,2)+pif(3:nn,:)*h(1,3);\nslp=((pif(2:nn-1,:)-pif(1:nn-2,:))/(1-1/c) ...\n    +(pif(3:nn,:)-pif(2:nn-1,:))/(c-1))/2;\nslp=[slp(1,:);slp;slp(nn-2,:)];\n\npbl=pif(1:nn-2,:)*h(2,1)+pif(2:nn-1,:)*h(2,2)+pif(3:nn,:)*h(2,3);\npbl=[pbl(1,:);pbl;pbl(nn-2,:)];\n\nfor ii=1:nn\n\tslp(ii,:)=slp(ii,:)/fx(ii);\n\tpbl(ii,:)=pbl(ii,:)/fx(ii);\nend;\n\n%------------------------------------------\n\n%function [c1,c2]=znormwght(n)\n\n%zz=0:1/n:3;\n%hh=[diff(zGcBs(zz,0)) 0]*n;\n%c1=sum((zz.*hh).^2)/n;\n%c2=sum((2*pi*zz.^2.*hh).^2)/n;\n\n%-------------------------------------------\n\nfunction p=zGcBs(x,k)\n\ntt=x+0.0000001;\np=tt.^k.*exp(-pi*tt.^2).*(sin(pi*tt+0.0001)./(pi*tt+0.0001)).^2;\n\n\n%--------------------------------------------\nfunction smap=zsmoothmapB(map,fs,f0floor,nvo,mu,mlim,pex)\n\n[nvc,mm]=size(map);\n%mu=0.4;\nt0=1/f0floor;\nlmx=round(6*t0*fs*mu);\nwl=2^ceil(log(lmx)/log(2));\ngent=((1:wl)-wl/2)/fs;\n\nsmap=map;\nmpv=1;\nzt=0*gent;\niiv=1:mm;\nfor ii=1:nvc\n\tt=gent*mpv; %t0*mu/mpv*1000\n\tt=t(abs(t)<3.5*mu*t0);\n\twbias=round((length(t)-1)/2);\n\twd1=exp(-pi*(t/(t0*(1-pex))/mu).^2);\n\twd2=exp(-pi*(t/(t0*(1+pex))/mu).^2);\n\twd1=wd1/sum(wd1);\n\twd2=wd2/sum(wd2);\n\ttm=fftfilt(wd1,[map(ii,:) zt]);\n\ttm=fftfilt(wd2,[1.0./tm(iiv+wbias) zt]);\n\tsmap(ii,:)=1.0./tm(iiv+wbias);\n\tif t0*mu/mpv*1000 > mlim\n\t\tmpv=mpv*(2.0^(1/nvo));\n\tend;\nend;\n\n%--------------------------------------------\n%function [ff,vv,df]=zfixpfreq2(fxx,pif2,mmp,dfv)\n%\n%nn=length(fxx);\n%iix=(1:nn)';\n%cd1=pif2-fxx;\n%cd2=[diff(cd1);cd1(nn)-cd1(nn-1)];\n%cdd1=[cd1(2:nn);cd1(nn)];\n%fp=(cd1.*cdd1<0).*(cd2<0);\n%ixx=iix(fp>0);\n%ff=pif2(ixx)+(pif2(ixx+1)-pif2(ixx)).*cd1(ixx)./(cd1(ixx)-cdd1(ixx));\n%vv=mmp(ixx);\n%vv=mmp(ixx)+(mmp(ixx+1)-mmp(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\n%df=dfv(ixx)+(dfv(ixx+1)-dfv(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\n\n%--------------------------------------------\nfunction [ff,vv,df,aa]=zfixpfreq3(fxx,pif2,mmp,dfv,pm)\n\naav=abs(pm);\nnn=length(fxx);\niix=(1:nn)';\ncd1=pif2-fxx;\ncd2=[diff(cd1);cd1(nn)-cd1(nn-1)];\ncdd1=[cd1(2:nn);cd1(nn)];\nfp=(cd1.*cdd1<0).*(cd2<0);\nixx=iix(fp>0);\nff=pif2(ixx)+(pif2(ixx+1)-pif2(ixx)).*cd1(ixx)./(cd1(ixx)-cdd1(ixx));\n%vv=mmp(ixx);\nvv=mmp(ixx)+(mmp(ixx+1)-mmp(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\ndf=dfv(ixx)+(dfv(ixx+1)-dfv(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\naa=aav(ixx)+(aav(ixx+1)-aav(ixx)).*(ff-fxx(ixx))./(fxx(ixx+1)-fxx(ixx));\n\n%--------------------------------------------\nfunction [c1,c2]=znrmlcf2(f)\n\nn=100;\nx=0:1/n:3;\ng=zGcBs(x,0);\ndg=[diff(g) 0]*n;\ndgs=dg/2/pi/f;\nxx=2*pi*f*x;\nc1=sum((xx.*dgs).^2)/n*2;\nc2=sum((xx.^2.*dgs).^2)/n*2;\n\n%--------------------------------------------\nfunction x=cleaninglownoise(x,fs,f0floor)\n\nflm=50;\nflp=round(fs*flm/1000);\nnn=length(x);\nwlp=fir1(flp*2,f0floor/(fs/2));\nwlp(flp+1)=wlp(flp+1)-1;\nwlp=-wlp;\n\ntx=[x(:)' zeros(1,2*length(wlp))];\nttx=fftfilt(wlp,tx);\nx=ttx((1:nn)+flp);\n\nreturn;\n\n"
  },
  {
    "path": "src/fractpitch2.m",
    "content": "function phs=fractpitch2(fftl)\n%\tPhase rotator for fractional pitch\n%\tThis program produces 'phs' as the phase rotator.\n\n%\tby Hideki Kawahara\n%\t22/August/1996\n\namp=15;\nt=((1:fftl)-fftl/2-1)/fftl*2;\nphs=t+(1-exp(amp*t))./(1+exp(amp*t)) ...\n   -(1+(1-exp(amp))/(1+exp(amp)))*t;\nphs(1)=0;\nphs=phs*pi;"
  },
  {
    "path": "src/gdmap.m",
    "content": "function gdm=gdmap(n3sgram,fs)\n%   gdm=gdmap(n3sgram,fs)\n%   function to calculate group delay map from \n%   smoothed time frequency representation\n\n%   Designed and coded by Hideki Kawahara\n%   7/Sept./2003\n\n[nn,mm]=size(n3sgram);\nfftl=(nn-1)*2;\n\nrbb2=fftl/2:-1:2;\ngdm=zeros(nn,mm);\nfor ii=1:mm\n    ff=[n3sgram(:,ii);n3sgram(rbb2,ii)];\n    ccp=real(fft(log(ff))); \n    ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n    ffx=(-ifft(ccp2));\n    gdt=-diff(imag(ffx)/(2*pi*fs/fftl));\n    gdm(:,ii)=[gdt(1);gdt(1:fftl/2)];\nend;\n"
  },
  {
    "path": "src/getvalufromedit.m",
    "content": "function y=getvalufromedit(co,defv)\n\nss=get(gco,'String');\ny=str2num(ss);\nif (length(y) <1) | (length(y)>1)\n  y=defv;\nend;\n"
  },
  {
    "path": "src/isOctave.m",
    "content": "function output = isOctave\nv = ver;\noutput = strcmp('Octave', v(1).Name);\nend"
  },
  {
    "path": "src/mktstr.m",
    "content": "function tstr=mktstr\n%\treturn time string in hh:mm:ss format\n%\tby Hideki Kawahara\n%\t05/Jan./1995\n\nanatime=fix(clock);\ntstr=[num2str(anatime(4)) ':' num2str(anatime(5)) ':' num2str(anatime(6))];\n"
  },
  {
    "path": "src/multanalytFineCSPB.m",
    "content": "function pm=multanalytFineCSPB(x,fs,f0floor,nvc,nvo,mu,mlt,imgi)\n\n%       Dual waveleta analysis using cardinal spline manipulation\n%               pm=multanalytFineCSPB(x,fs,f0floor,nvc,nvo,mu,mlt)\n%       Input parameters \n%               \n%               x       : input signal (2kHz sampling rate is sufficient.)\n%               fs      : sampling frequency (Hz)\n%               f0floor : lower bound for pitch search (60Hz suggested)\n%               nvc     : number of total voices for wavelet analysis\n%               nvo     : number of voices in an octave\n%\t\t\t\tmu\t\t: temporal stretch factor\n%\t\t\t\tmlt\t\t: harmonic ID#\n%\t\t\t\timgi\t: display indicator, 1: dispaly on (default), 0: display off\n%       Outpur parameters\n%               pm      : wavelet transform using iso-metric Gabor function\n%\n%       If you have any questions,  mailto:kawahara@hip.atr.co.jp\n%\n%       Copyright (c) ATR Human Information Processing Research Labs. 1996\n%       Invented and coded by Hideki Kawahara\n%       30/Oct./1996\n%       07/Dec./2002 waitbar was added\n%\t\t10/Aug./2005 modified by Takahashi on waitbar\n%\t\t10/Sept./2005 modified by Kawahara on waitbar\n\nif nargin==7; imgi=1; end;%10/Sept./2005\nt0=1/f0floor;\nlmx=round(6*t0*fs*mu);\nwl=2^ceil(log(lmx)/log(2));\nx=x(:)';\nnx=length(x);\ntx=[x,zeros(1,wl)];\ngent=((1:wl)-wl/2)/fs;\n\npm=zeros(nvc,nx);\nmpv=1;\nif imgi==1; hpg=waitbar(0,['wavelet analysis for initial F0 ' ...\n    'and P/N estimation with HM#:' num2str(mlt)]); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfor ii=1:nvc\n  tb=gent*mpv;\n  t=tb(abs(tb)<3.5*mu*t0);\n  wd1=exp(-pi*(t/t0/mu).^2);\n  wd2=max(0,1-abs(t/t0/mu));\n  wd2=wd2(wd2>0);\n  wwd=conv(wd2,wd1);\n  wwd=wwd(abs(wwd)>0.00001);\n  wbias=round((length(wwd)-1)/2);\n  wwd=wwd.*exp(1i*2*pi*mlt*t(round((1:length(wwd))-wbias+length(t)/2))/t0);\n  pmtmp1=fftfilt(wwd,tx);\n  pm(ii,:)=pmtmp1(wbias+1:wbias+nx)*sqrt(mpv);\n  mpv=mpv*(2.0^(1/nvo));\n  if imgi==1; waitbar(ii/nvc); end; %,hpg);% 07/Dec./2002 by H.K.%10/Aug./2005\nend;\nif imgi==1; close(hpg); end; % 07/Dec./2002 by H.K.%10/Aug./2005\n"
  },
  {
    "path": "src/optimumsmoothing.m",
    "content": "function ovc=optimumsmoothing(eta,pc)\n%\tovc=optimumsmoothing(eta,pc)\n%\tCalculate the optimum smoothing function\n%\tovc\t: coefficients for 2nd order cardinal B-spline\n%\teta\t: temporal stretch factor\n%\tpc\t: power exponent for nonlinearity\n\n%   05/July/2006 dirty patch. This routine has to be re-programmed.\n\nfx=-8:0.05:8;\ncb=max(0,1-abs(fx));\ngw=exp(-pi*(fx*eta*1.4).^2).^pc;\ncmw=conv(cb,gw);\nbb=(1:length(cb));\nbbc=bb+(length(cb)-1)/2;\ncmw=cmw(bbc)/max(cmw);\nss=(abs(fx-round(fx))<0.025).*(1:length(cb));\nss=ss(ss>0);\ncmws=cmw(ss);\n\nnn=length(cmws);\nidv=1:nn;\n\nhh=zeros(2*nn,nn);\nfor ii=1:nn\n  hh((ii-1)+idv,ii)=cmws';\nend;\nbv=zeros(2*nn,1);\nbv(nn+1)=1;             % This is the original unit impulse.\nh=hh'*hh;\nov = h \\ (hh'*bv);\n\nidc=(nn-1)/2+2;\n\novc=ov(idc+(0:3));\n"
  },
  {
    "path": "src/plotcpower.m",
    "content": "function [pw,pwh]=plotcpower(x,fs,shiftm)\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n\nflm=8;  % originally; 01/August/1999 . \nfl=round(flm*fs/1000);\nw=hanning(2*fl+1);\nw=w/sum(w);\nnn=length(x);\n\nflpm=40;\nflp=round(flpm*fs/1000);\nwlp=fir1(flp*2,70/(fs/2));\nwlp(flp+1)=wlp(flp+1)-1;\nwlp=-wlp;\n\ntx=[x(:)' zeros(1,2*length(wlp))];\nttx=fftfilt(wlp,tx);\nttx=ttx((1:nn)+flp);\ntx=[ttx(:)' zeros(1,2*length(w))];\n\npw=fftfilt(w,tx.^2);\npw=pw((1:nn)+fl);\nmpw=max(pw);\npw=pw(round(1:shiftm*fs/1000:nn));\npw(pw<mpw/10000000)=pw(pw<mpw/10000000)+mpw/10000000; % safeguard 15/Jan./2003\n\nb=fir1(2*fl+1,[0.0001 3000/(fs/2)]);\nb(fl+1)=b(fl+1)-1;\nxh=fftfilt(b,tx);\nxh=xh((1:nn)+fl);\ntx=[xh(:)' zeros(1,10*length(w))];\npwh=fftfilt(w,tx.^2);\npwh=pwh((1:nn)+fl);\npwh=pwh(round(1:shiftm*fs/1000:nn)); \npwh(pwh<mpw/10000000)=pwh(pwh<mpw/10000000)+mpw/10000000;% safeguard 15/Jan./2003\n\n%subplot(614);\ntt=1:length(pw);\nhhg=plot(tt*shiftm,10*log10(pw),'b');hold on;\nplot(tt*shiftm,10*log10(pwh),'r');grid on;hold off;\nset(hhg,'LineWidth',2);\nmp=max(10*log10(pw));\naxis([0 max(tt)*shiftm mp-70 mp+5]);\nylabel('level (dB)');\ntitle('thick line: total power thin line:high fq. power (>3kHz) ');\nend\n"
  },
  {
    "path": "src/powerchk.m",
    "content": "function pow=powerchk(x,fs,segms)\n%\tCalculate average power of voiced portion\n%\tpow=powerchk(x,fs,segms)\n%\t\tx\t: signal\n%\t\tfs\t: sampling frequency (Hz)\n%\t\tsegms\t: segment length (ms)\n\n%\t23/Sept./1999 updated\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n\nx1=x(:);\niv=(1:length(x1))';\nx1(isnan(x1))=iv(isnan(x1))*0+0.0000000001;\nx2=x1.*x1;\nn=round(segms/1000*fs); % 23/Sept./1999\nnw=ceil(length(x)/n);\nif rem(length(x),n)>0\n  x2=[x2;0.000001*randn(n*nw-length(x),1).^2]; % 23/Sept./1999\nend;\nx2(x2==0)=x2(x2==0)+0.000001;\n\npw=sum(reshape(x2,n,nw))/n;\n\npow=10*log10(mean(pw(pw>(mean(pw)/30))));\n\n"
  },
  {
    "path": "src/refineF06.m",
    "content": "function [f0r,ecr]=refineF06(x,fs,f0raw,fftl,eta,nhmx,shiftm,nl,nu,imgi)\n%\tF0 estimation refinement\n%\t[f0r,ecr]=refineF06(x,fs,f0raw,fftl,nhmx,shiftm,nl,nu,imgi)\n%\t\tx\t\t: input waveform\n%\t\tfs\t\t: sampling frequency (Hz)\n%\t\tf0raw\t: F0 candidate (Hz)\n%\t\tfftl\t: FFT length\n%\t\teta\t\t: temporal stretch factor\n%\t\tnhmx\t: highest harmonic number\n%\t\tshiftm\t: frame shift period (ms)\n%\t\tnl\t\t: lower frame number\n%\t\tnu\t\t: uppter frame number\n%\t\timgi\t: display indicator, 1: display on (default), 0: off\n%\n%\tExample of usage (with STRAIGHT)\n%\n%\tglobal xold fs f0shiftm f0raw\n%\n%\tdn=floor(fs/(800*3*2));\n%\t[f0raw,ecr]=refineF02(decimate(xold,dn),fs/dn,f0raw,512,1.1,3,f0shiftm,1,length(f0raw));\n\n%\tDesigned and coded by Hideki Kawahara\n%\t28/July/1999\n%\t29/July/1999 test version using power weighting\n%\t30/July/1999 GcBs is added (bug fix)\n%\t07/August/1999 small bug fix\n%   07/Dec./2002 wqitbar was added\n%   13.May/2005 minor vulnerability fix\n%\t10/Aug./2005 modified by Takahashi on waitbar\n%\t10/Sept./2005 modified by Kawahara on waitbar\n%   16/Sept./2005 minor bug fix\n%   26/Sept./2005 bug fix\n\nif nargin==9; imgi=1; end;\nf0i=f0raw(:);\nf0i(f0i==0)=f0i(f0i==0)+160;\nfax=(0:fftl-1)/fftl*fs;\nnfr=length(f0i); % 07/August/1999 \n\nshiftl=shiftm/1000*fs;\nx=[zeros(fftl,1); x(:) ; zeros(fftl,1)]';\n\ntt=((1:fftl)-fftl/2)/fs;\nth=(0:fftl-1)/fftl*2*pi;\nrr=exp(-1i*th);\n\nf0t=100;\nw1=max(0,1-abs(tt'*f0t/eta));\nw1=w1(w1>0);\nwg=exp(-pi*(tt*f0t/eta).^2);\nwgg=(wg(abs(wg)>0.0002));\nwo=fftfilt(wgg,[w1; zeros(length(wgg),1)])';\n\nxo=(0:length(wo)-1)/(length(wo)-1);\nnlo=length(wo)-1;\n\nif nl*nu <0\n\tnl=1;\n\tnu=nfr;\nend;\n\nbx=1:fftl/2+1;\npif=zeros(fftl/2+1,nfr);\ndpif=zeros(fftl/2+1,nfr);\npwm=zeros(fftl/2+1,nfr);\nrmsValue = std(x); % 26/Sept./2005 by HK\n\nif imgi==1; hpg=waitbar(0,'F0 refinement using F0 adaptive analysis'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfor kk=nl:nu\n\t\tif f0i(kk) < 40\n\t\tf0i(kk)=40;\n\tend;\n\tf0t=f0i(kk);\n\txi=0:1/nlo*f0t/100:1;\n\twa=interp1(xo,wo,xi,'*linear');\n\twal=length(wa);\n\tbb=1:wal;\n\tbias=round(fftl-wal/2+(kk-1)*shiftl);\n    if std(x(bb+bias))*std(x(bb+bias-1))*std(x(bb+bias+1)) == 0 % 26/Sept./2005 by HK\n        x(bb+bias) = randn(length(bb),1)*rmsValue/100000;\n    end;\n\tdcl=mean(x(bb+bias));\n\tff0=fft((x(bb+bias-1)-dcl).*wa,fftl);\n\tff1=fft((x(bb+bias)-dcl).*wa,fftl);\n\tff2=fft((x(bb+bias+1)-dcl).*wa,fftl);\n\tfd=ff2.*rr-ff1;\n\tfd0=ff1.*rr-ff0;\n\tcrf=fax+(real(ff1).*imag(fd)-imag(ff1).*real(fd))./(abs(ff1).^2)*fs/pi/2;\n\tcrf0=fax+(real(ff0).*imag(fd0)-imag(ff0).*real(fd0))./(abs(ff0).^2)*fs/pi/2;\n\tpif(:,kk)=crf(bx)'*2*pi;\n\tdpif(:,kk)=(crf(bx)-crf0(bx))'*2*pi;\n\tpwm(:,kk)=abs(ff1(bx)'); % 29/July/1999\n        if imgi==1; waitbar((kk-nl)/(nu-nl)); end; % ,hpg) % 07/Dec./2002 by H.K.%10/Aug./2005\nend;\nif imgi==1; close(hpg); end;\nslp=([pif(2:fftl/2+1,:);pif(fftl/2+1,:)]-pif)/(fs/fftl*2*pi);\ndslp=([dpif(2:fftl/2+1,:);dpif(fftl/2+1,:)]-dpif)/(fs/fftl*2*pi)*fs;\nmmp=slp*0;\n\n[c1,c2]=znrmlcf2(shiftm);\nfxx=((0:fftl/2)+0.5)/fftl*fs*2*pi;\n\n%--- calculation of relative noise level\n\nif imgi==1; hpg=waitbar(0,'P/N calculation'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\nfor ii=1:fftl/2+1;\n\tc2=c2*(fxx(ii)/2/pi)^2;\n\tmmp(ii,:)=(dslp(ii,:)/sqrt(c2)).^2+(slp(ii,:)/sqrt(c1)).^2;\n    if imgi==1 && rem(ii,10)==0;waitbar(ii/(fftl/2+1));end;  % 07/Dec./2002 by H.K.%10/Aug./2005\nend;\nif imgi==1; close(hpg); end; % 07/Dec./2002 by H.K.%10/Aug./2005\n\n%--- Temporal smoothing\n\nsml=round(1.5*fs/1000/2/shiftm)*2+1; % 3 ms, and odd number\nsmb=round((sml-1)/2); % bias due to filtering\n\nif imgi==1; hpg=waitbar(0,'P/N smoothing'); end; % 07/Dec./2002 by H.K.%10/Aug./2005\n%This smoothing is modified (30 Nov. 2000).\nsmmp=fftfilt((hanning(sml).^2)/sum((hanning(sml).^2)), ...\n    [mmp zeros(fftl/2+1,sml*2)]'+max(max(mmp((~isnan(mmp))&(mmp<Inf))))*0.0000001)'; % 26/Sept./2005 by H.K.\nif imgi==1; waitbar(0.2); end;%10/Aug./2005\nsmmp=1.0./fftfilt(hanning(sml)/sum(hanning(sml)),1.0./smmp')';\nif imgi==1; waitbar(0.4); end;\nsmmp=smmp(:,max(1,(1:nfr)+sml-2)); % fixed by H.K. on 10/Dec./2002\n\n%--- Power adaptive weighting (29/July/1999)\n\nspwm=fftfilt(hanning(sml)/sum(hanning(sml)),[pwm zeros(fftl/2+1,sml*2)]'+0.00001)';\nif imgi==1; waitbar(0.6); end;%10/Aug./2005\nspfm=fftfilt(hanning(sml)/sum(hanning(sml)),[pwm.*pif zeros(fftl/2+1,sml*2)]'+0.00001)';\nif imgi==1; waitbar(0.8); end;%10/Aug./2005\nspif=spfm./spwm;\nspif=spif(:,(1:nfr)+smb);\n\nidx=max(0,f0i/fs*fftl);\nfqv=zeros(nhmx,nfr);\nvvv=zeros(nhmx,nfr);\n\niidx=(0:nfr-1)*(fftl/2+1)+1;\nfor ii=1:nhmx\n\tiidx=idx(:)'+iidx;\n\tvvv(ii,:)=(smmp(floor(iidx))+(iidx-floor(iidx)).*(smmp(floor(iidx)+1)-smmp(floor(iidx))))/(ii*ii);\n\tfqv(ii,:)=(spif(floor(iidx))+(iidx-floor(iidx)).*(spif(floor(iidx)+1)-spif(floor(iidx))))/2/pi/ii; % 29/July/199\nend;\nif imgi==1; waitbar(1); end;%10/Aug./2005\nvvvf=1.0./sum(1.0./vvv);\nf0r=sum(fqv./sqrt(vvv))./sum(1.0./sqrt(vvv)).*(f0raw(:)'>0);\necr=sqrt(1.0./vvvf).*(f0raw(:)'>0)+(f0raw(:)'<=0);\nif imgi==1; close(hpg); end;%10/Aug./2005\n\n%keyboard;\n\n%--------------------\nfunction [c1,c2]=znrmlcf2(f)\n\nn=100;\nx=0:1/n:3;\ng=GcBs(x,0);\ndg=[diff(g) 0]*n;\ndgs=dg/2/pi/f;\nxx=2*pi*f*x;\nc1=sum((xx.*dgs).^2)/n;\nc2=sum((xx.^2.*dgs).^2)/n;\n\n%---------------------\nfunction p=GcBs(x,k)\n\ntt=x+0.0000001;\np=tt.^k.*exp(-pi*tt.^2).*(sin(pi*tt+0.0001)./(pi*tt+0.0001)).^2;\n\n\n"
  },
  {
    "path": "src/regressionTestBaseGenerator.m",
    "content": "%% Regression test data generator\n% This program should be executed at the very beginning of refactoring a\n% major revision. This is for making legacy STRAIGHT v40_007d to be\n% compatible with MATLAB R2015b and Octave\n\n% Copyright(c) 2016, Hideki Kawahara, (kawahara@sys.wakayama-u.ac.jp)\n\nclear all\nclose all\n\noriginal_speech_dir = '~/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\ntarget_analysis_dir = '~/m-file/STRAIGHTV40_007e/analysisData/';\ntarget_wave_dir = '~/m-file/STRAIGHTV40_007e/waveData/';\n\nmkdir(target_analysis_dir);\nmkdir(target_wave_dir);\n\ndir_list = dir([original_speech_dir 'p*']);\n\n%%\n\nn_dirs = length(dir_list);\nn_files = 0;\nfor ii = 1:n_dirs\n  tmp_files = dir([original_speech_dir dir_list(ii).name '/*.wav']);\n  n_files = n_files + length(tmp_files);\nend;\n%%\nn_test = 2; % number of files tested for each speaker\nl_segment = 0.1; % 100 ms segment\nfor ii = 1:n_dirs\n  rng(12345); % initialize frozen random number\n  seq_id = 0;\n  basic_stat_table = zeros(n_files, 4);\n  tmp_files = dir([original_speech_dir dir_list(ii).name '/*.wav']);\n  for jj = 1:length(tmp_files)\n    [x, fs] = audioread([original_speech_dir dir_list(ii).name '/' ...\n      tmp_files(jj).name ]);\n    seq_id = seq_id + 1;\n    l_in_sample_segment = min(length(x), round(fs * l_segment));\n    n_segment = floor(length(x) / l_in_sample_segment);\n    rms_level = zeros(n_segment, 1);\n    for kk = 1:n_segment\n      rms_level(kk) = 20 * ...\n        log10(std(x((kk - 1) * l_in_sample_segment + ...\n        (1:l_in_sample_segment))));\n    end;\n    sorted_level = sort(rms_level);\n    basic_stat_table(seq_id, 1) = length(x) / fs;\n    basic_stat_table(seq_id, 2) = max(rms_level) - min(rms_level);\n    basic_stat_table(seq_id, 3) = ...\n      sorted_level(round(length(sorted_level) * 0.85));\n    basic_stat_table(seq_id, 4) = max(abs(x));\n  end;\n  basic_stat_table = basic_stat_table(1:seq_id, :);\n  % select safe region\n  sorted_length = sort(basic_stat_table(:, 1));\n  sorted_dynamic_range = sort(basic_stat_table(:, 2));\n  sorted_85percent = sort(basic_stat_table(:, 3));\n  l_10 = sorted_length(round(seq_id * 0.1));\n  l_90 = sorted_length(round(seq_id * 0.9));\n  d_10 = sorted_dynamic_range(round(seq_id * 0.1));\n  d_90 = sorted_dynamic_range(round(seq_id * 0.9));\n  v_10 = sorted_85percent(round(seq_id * 0.1));\n  v_90 = sorted_85percent(round(seq_id * 0.9));\n  index_list = 1:seq_id;\n  safe_index = index_list( ...\n    l_10 < basic_stat_table(:, 1) & l_90 > basic_stat_table(:, 1) & ...\n    d_10 < basic_stat_table(:, 2) & d_90 > basic_stat_table(:, 2) & ...\n    v_10 < basic_stat_table(:, 3) & v_90 > basic_stat_table(:, 3) & ...\n    basic_stat_table(:, 4) < 0.95);\n  selection_index = 1:length(safe_index);\n  [~, tmp_index] = sort(rand(n_test, 1));\n  selection_index = selection_index(tmp_index(1:n_test));\n  for kk = 1:n_test\n    id = safe_index(selection_index(kk));\n    [x, fs] = audioread([original_speech_dir dir_list(ii).name '/' ...\n      tmp_files(id).name ]);\n    rng(12345); % initialize frozen random number\n    f0raw = MulticueF0v14(x,fs);\n    ap = exstraightAPind(x,fs,f0raw);\n    n3sgram=exstraightspec(x,f0raw,fs);\n    rng(12345); % initialize frozen random number\n    y = exstraightsynth(f0raw,n3sgram,ap,fs);\n    disp([num2str(kk) ': ' tmp_files(id).name  ' at:' datestr(now)]);\n    audiowrite([target_wave_dir '/' tmp_files(id).name], ...\n      y / max(abs(y)) * 0.9, fs);\n    path_name_f0 = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'f0.bin'];\n    path_name_ap = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'ap.bin'];\n    path_name_sp = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'sp.bin'];\n    WriteBinaryData(path_name_f0, f0raw)\n    WriteBinaryData(path_name_ap, ap)\n    WriteBinaryData(path_name_sp, n3sgram)\n  end;\nend;\n"
  },
  {
    "path": "src/regressionTestBaseGeneratorR.m",
    "content": "%% Regression test data generator\n% This program should be executed at the very beginning of refactoring a\n% major revision. This is for making legacy STRAIGHT v40_007d to be\n% compatible with MATLAB R2015b and Octave\n% Revised for initialization\n\n% Copyright(c) 2016, Hideki Kawahara, (kawahara@sys.wakayama-u.ac.jp)\n\nclear all\nclose all\n\noriginal_speech_dir = '/Users/kawahara/Music/VCTK_CORPUS/VCTK-Corpus/wav48/';\nif isOctave\n  target_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisDataO/';\n  target_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveDataO/';\nelse\n  target_analysis_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/analysisDataR/';\n  target_wave_dir = '/Users/kawahara/m-file/STRAIGHTV40_007e/waveDataR/';\nend;\n\nmkdir(target_analysis_dir);\nmkdir(target_wave_dir);\n\ndir_list = dir([original_speech_dir 'p*']);\n\n%%\n\nn_dirs = length(dir_list);\nn_files = 0;\nfor ii = 1:n_dirs\n  tmp_files = dir([original_speech_dir dir_list(ii).name '/*.wav']);\n  n_files = n_files + length(tmp_files);\nend;\n%%\nn_test = 2; % number of files tested for each speaker\nl_segment = 0.1; % 100 ms segment\ncommand1 = 'rand(\"seed\", 12345);'; % for Octave\ncommand2 = 'randn(\"seed\", 12345);';% for Octave\nfor ii = 1:n_dirs\n  if isOctave\n    eval(command1);\n    eval(command2);\n  else\n    rng(12345); % initialize frozen random number\n  end;\n  seq_id = 0;\n  basic_stat_table = zeros(n_files, 4);\n  tmp_files = dir([original_speech_dir dir_list(ii).name '/*.wav']);\n  for jj = 1:length(tmp_files)\n    [x, fs] = audioread([original_speech_dir dir_list(ii).name '/' ...\n      tmp_files(jj).name ]);\n    seq_id = seq_id + 1;\n    l_in_sample_segment = min(length(x), round(fs * l_segment));\n    n_segment = floor(length(x) / l_in_sample_segment);\n    rms_level = zeros(n_segment, 1);\n    for kk = 1:n_segment\n      rms_level(kk) = 20 * ...\n        log10(std(x((kk - 1) * l_in_sample_segment + ...\n        (1:l_in_sample_segment))));\n    end;\n    sorted_level = sort(rms_level);\n    basic_stat_table(seq_id, 1) = length(x) / fs;\n    basic_stat_table(seq_id, 2) = max(rms_level) - min(rms_level);\n    basic_stat_table(seq_id, 3) = ...\n      sorted_level(round(length(sorted_level) * 0.85));\n    basic_stat_table(seq_id, 4) = max(abs(x));\n  end;\n  basic_stat_table = basic_stat_table(1:seq_id, :);\n  % select safe region\n  sorted_length = sort(basic_stat_table(:, 1));\n  sorted_dynamic_range = sort(basic_stat_table(:, 2));\n  sorted_85percent = sort(basic_stat_table(:, 3));\n  l_10 = sorted_length(round(seq_id * 0.1));\n  l_90 = sorted_length(round(seq_id * 0.9));\n  d_10 = sorted_dynamic_range(round(seq_id * 0.1));\n  d_90 = sorted_dynamic_range(round(seq_id * 0.9));\n  v_10 = sorted_85percent(round(seq_id * 0.1));\n  v_90 = sorted_85percent(round(seq_id * 0.9));\n  index_list = 1:seq_id;\n  safe_index = index_list( ...\n    l_10 < basic_stat_table(:, 1) & l_90 > basic_stat_table(:, 1) & ...\n    d_10 < basic_stat_table(:, 2) & d_90 > basic_stat_table(:, 2) & ...\n    v_10 < basic_stat_table(:, 3) & v_90 > basic_stat_table(:, 3) & ...\n    basic_stat_table(:, 4) < 0.95);\n  selection_index = 1:length(safe_index);\n  [~, tmp_index] = sort(rand(n_test, 1));\n  selection_index = selection_index(tmp_index(1:n_test));\n  for kk = 1:n_test\n    id = safe_index(selection_index(kk));\n    [x, fs] = audioread([original_speech_dir dir_list(ii).name '/' ...\n      tmp_files(id).name ]);\n    if isOctave\n      eval(command1);\n      eval(command2);\n    else\n      rng(12345); % initialize frozen random number\n    end;\n    f0raw = MulticueF0v14(x,fs);\n    ap = exstraightAPind(x,fs,f0raw);\n    n3sgram=exstraightspec(x,f0raw,fs);\n    if isOctave\n      eval(command1);\n      eval(command2);\n    else\n      rng(12345); % initialize frozen random number\n    end;\n    y = exstraightsynth(f0raw,n3sgram,ap,fs);\n    disp([num2str(kk) ': ' tmp_files(id).name  ' at:' datestr(now)]);\n    audiowrite([target_wave_dir '/' tmp_files(id).name], ...\n      y / max(abs(y)) * 0.9, fs);\n    path_name_f0 = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'f0.bin'];\n    path_name_ap = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'ap.bin'];\n    path_name_sp = [target_analysis_dir '/' tmp_files(id).name(1:end-4) 'sp.bin'];\n    WriteBinaryData(path_name_f0, f0raw)\n    WriteBinaryData(path_name_ap, ap)\n    WriteBinaryData(path_name_sp, n3sgram)\n  end;\nend;\n"
  },
  {
    "path": "src/smax.m",
    "content": "function y=smax(x,a,b)\n\ny0=1.0/(1+exp(-a*(0-b)));\ny1=1.0/(1+exp(-a*(1-b)));\ny=(1.0./(1+exp(-a*(x-b)))-y0)/(y1-y0);\n"
  },
  {
    "path": "src/specreshape.m",
    "content": "function n2sgram3=specreshape(fs,n2sgram,eta,pc,mag,f0,imgi)\n%      Spectral compensation using Time Domain technique\n%      n2sgram3=specreshape(fs,n2sgram,eta,pc,mag,f0);\n%           fs        : sampling frequency (Hz)\n%           n2sgram   : Straight smoothed spectrogram (optimum smoother is assumed)\n%           eta       : temporal stretch factor\n%           pc        : power exponent for nonlinearity\n%           mag       : magnification factor of Time Domain compensation\n%           f0        : fundamental frequency (Hz)\n%\t\t\timgi\t: display indicator, 1: display on (default), 0: off\n\n%      coded by Hideki Kawahara\n%\t13/Aug./1997\n%\t08/Dec./2002\n%\tNote: This part may be redundant. It is better to\n%\tevaluate contribution of this part again. (08/Dec./2002)\n%\t10/Aug./2005 modified by Takahashi on waitbar\n%\t10/Sept./2005 modified by Kawahara on waitbar\n\nif nargin==6; imgi=1; end;%10/Sept./2005\n[nn,mm]=size(n2sgram);\nfftl=(nn-1)*2;\nfbb=1:nn;\nrbb=(nn-1:-1:2);\nrbb2=(fftl:-1:nn+1);\nbb3=(2:nn-1);\nn2sgram3=n2sgram*0;\n\novc=optimumsmoothing(eta,pc);\nhh=[1 1 1 1; 0 1/2 2/3 3/4; 0 0 1/3 2/4; 0 0 0 1/4];\n%%bb=inv(hh)*ovc;\nbb=hh \\ ovc;\ntt=((0:fftl-1))'/fs;\npb2=(pi/(eta^2)+(pi^2)/3*(bb(1)+4*bb(2)+9*bb(3)+16*bb(4)))*tt.^2;\n\nif imgi==1; hpg=waitbar(0,'time domain spectral compensation of windowing effects'); end; % 08/Dec./2002%10/Aug./2005\nfor ii=1:mm\n  ffs=[n2sgram(:,ii);n2sgram(rbb,ii)];\n  ccs2=real(fft(ffs)).*min(20,(1+mag*pb2*f0(ii)^2));\n  ccs2(rbb2)=ccs2(bb3);\n  ngg=real(ifft(ccs2));\n  n2sgram3(:,ii)=ngg(fbb);\n  if imgi==1 && rem(ii,20)==0;%10/Aug./2005\n\t  waitbar(ii/mm);% 08/Dec./2002\n  end;\nend;\nif imgi==1; close(hpg); end; % 08/Dec./2002%10/Aug./2005\n\n%n2sgram3=(abs(n2sgram3)+n2sgram3)/2;\nn2sgram3=(abs(n2sgram3)+n2sgram3)/2+0.1;\n"
  },
  {
    "path": "src/straight.m",
    "content": "%\tStarter command for GUI-STRAIGHT\n\nstraightCIv1 GUIinitialize;\n"
  },
  {
    "path": "src/straightBodyC03ma.m",
    "content": "function [n2sgram,nsgram]=straightBodyC03ma(x,fs,shiftm,fftl,f0raw,f0var,f0varL,eta,pc,imgi)\n%  [n2sgram,nsgram]=straightBodyC03ma(x,fs,shiftm,fftl,f0raw,f0var,f0varL,eta,pc,imgi)\n%\tn2sgram\t\t: smoothed spectrogram\n%\tnsgram\t\t: isometric spectrogram\n%\tx\t\t: input waveform\n%\tfs\t\t: sampling frequency (Hz)\n%\tshiftm\t\t: frame shift (ms)\n%\tfftl\t\t: length of FFT\n%\tf0raw\t\t: Pitch information to gude analysis (TEMPO) assumed\n%\tf0var\t\t: expected f0 variance including zerocross information\n%\tf0varL\t\t: expected f0 variance\n%\teta\t\t:\n%\tpc\t\t:\n%\timgi\t: display indicator 1: display on (default), 0: off\n\n%\tf0shiftm\t: frame shift (ms) for F0 analysis\n\n%\tSTRAIGHT body:  Interporation using adaptive gaussian weighting\n%\tand 2-dimensional Bartlett window\n%\tby Hideki Kawahara\n%\t02/July/1996\n%\t07/July/1996\n%\t07/Sep./1996\n%\t09/Sep./1996 guiding F0 information can be coarse\n%\t14/Oct./1996 correction for over smoothing\n%\t19/Oct./1996 Alternating Gaussian Correction\n%\t01/Nov./1996 Temporal integration using Fluency theory (didn't work)\n%\t03/Nov./1996 Temporal integration using Fluency theory\n%\t25/Dec./1996 Quasi optimum smooting\n%\t01/Feb./1997 Minimum variance analysis\n%\t03/Feb./1997 Clean up\n%\t08/Feb./1997 Fine tuning for onset enhancement\n%\t13/Feb./1997 another fine temporal structure\n%\t16/Feb./1997 better alternating Gaussian\n%\t21/Feb./1997 no need for temporal interpolation!\n%\t19/June/1997 Control of Analysis Paramters\n%\t21/July/1997 Discard of optimum comp. and introduction TD compensation\n%\t11/Aug./1997 Re-installation of temporal smooting\n%\t08/Feb./1998 debug and speed up using closed form\n%\t22/April/1999 Compatible with new F0 extraction routine\n%\t31/March/2002 modified for ICSLP2002\n%   03/Feb./2003 Bug fix in the modification on 31/March/2002\n%\t10/Aug./2005 modified by Takahashi on waitbar\n%\t10/Sept./2005 modified by Kawahara on waitbar\n%   05/Oct./2005 bug fix on smoothing (both in time and frequency)\n%   04/July/2006 bug fix on compensatory time window\n\nif nargin==9; imgi=1; end; % 10/Sept./2005\nf0l=f0raw(:) + 0 * f0var + 0 * f0varL; % + 0 * f0var + 0 * f0varL are dummy\nframem=80;\nframel=round(framem*fs/1000);\nif fftl<framel\n  disp('Warning! fftl is too small.');\n  fftl=2^ceil(log(framel)/log(2) );\n  disp(['New length:' num2str(fftl) ' is used.']);\nend;\nx=x(:)';\nshiftl=shiftm*fs/1000;\n\n%   High-pass filtering using 70Hz cut-off butterworth filter\n[b,a]=butter(6,70/fs*2,'high');\nxh=filter(b,a,x);\nrmsp=std(xh);\n\n[b,a]=butter(6,300/fs*2,'high');  % 08/Sept./1999\nxh2=filter(b,a,x);\n\n\n%\tHigh-pass filter using 3000Hz cut-off butterworth filter\n[b,a]=butter(6,3000/fs*2,'high');\nxhh=filter(b,a,x);\n\ntx=[randn(1,round(framel/2))*rmsp/4000,xh,randn(1,framel)*rmsp/4000]; % 04/July/2006\nnframe=min(length(f0l),round(length(x)/shiftl));\n\nnsgram=zeros(fftl/2+1,nframe);  % adaptive spectrogram\nn2sgram=zeros(fftl/2+1,nframe);\n\ntt=((1:framel)-framel/2)/fs;\nbbase=1:fftl/2+1;\n\nist=1; % ii=1;\nf0x=f0l*0;\n\n% Optimum blending table for interference free spec.\ncfv=[0.36 0.30 0.26 0.21 0.17 0.14 0.1];\nmuv=[1    1.1  1.2  1.3  1.4  1.5   1.6];\n\nbcf=spline(muv,cfv,eta);\n\n% Calculate the optimum smoothing function coefficients\n\novc=optimumsmoothing(eta,pc);\n\n%---- designing pitch synchronized gaussian ---- bug fix 04/July/2006\nfNominal = 40;\nwGaussian = exp(-pi*(tt*fNominal/eta).^2);\nwSynchronousBartlett = max(0,1-abs(tt*fNominal));\nwPSGSeed = fftfilt(wSynchronousBartlett(wSynchronousBartlett>0),[wGaussian zeros(1,length(tt))]);\nwPSGSeed = wPSGSeed/max(wPSGSeed);\n[~,maxLocation] = max(wPSGSeed);\ntNominal = ((1:length(wPSGSeed))-maxLocation)/fs;\n%---- end of bug fix\n\nttm=[0.00001 1:fftl/2 -fftl/2+1:-1]/fs;\n\nlft=1.0./(1+exp(-(abs((1:fftl)-fftl/2-1)-fftl/30)/2)); % safeguard 05/Oct./2005 by HK\n\nif imgi==1; hpg=waitbar(0,'F0 adaptive time-frequency analysis.'); end;% 10/Aug./2005\nfor ii=1:nframe\n  if imgi==1 && rem(ii,10)==0 % 10/Aug./2005\n    waitbar(ii/nframe);\n  end;\n  f0=f0l(max(1,ii));\n  if f0==0\n    f0=160; % 09/Sept./1999\n  end;\n  \n  f0x(ii)=f0;\n  t0=1/f0;\n  \n  %wxe = interp1q(tNominal',wPSGSeed',tt'*f0/fNominal)'; %bug fix 04/July/2006\n  wxe = interp1(tNominal',wPSGSeed',tt'*f0/fNominal,'linear','extrap')';\n  wxe(isnan(wxe))=zeros(size(wxe(isnan(wxe))));\n  wxe=wxe/sqrt(sum(wxe.^2));\n  wxd=bcf*wxe.*sin(pi*tt/t0);\n  \n  iix=round(ist:ist+framel-1);\n  pw=sqrt(abs(fft((tx(iix)-mean(tx(iix))).*wxe,fftl)).^2+ ...\n    abs(fft((tx(iix)-mean(tx(iix))).*wxd,fftl)).^2).^pc;\n  \n  nsgram(:,ii)=pw(bbase)';\n  f0p2=floor((f0/fs*fftl)/2+1); % modified by H.K. on 3/Feb./2003\n  f0p=ceil((f0/fs*fftl)+1); % modified by H.K. on 3/Feb./2003\n  f0pr=f0/fs*fftl+1; % added by H.K. on 3/Feb./2003\n  tmppw=interp1(1:f0p,pw(1:f0p),f0pr-((1:f0p2)-1)); % added by H.K. on 3/Feb./2003\n  pw(1:f0p2)=tmppw; % modified by H.K. on 3/Feb./2003\n  pw(fftl:-1:fftl-f0p2+2)=pw(2:f0p2);\n  \n  %  local level equalization\n  ww2t=(sin(ttm/(t0/3)*pi)./(ttm/(t0/3)*pi)).^2;\n  spw2=real(ifft(ww2t.*fft(pw).*lft));\n  spw2(spw2==0)=spw2(spw2==0)+eps;  %%% safe guard added on 15/Jan./2003\n  \n  %\tOptimum weighting\n  wwt=(sin(ttm/t0*pi)./(ttm/t0*pi)).^2.*(ovc(1)+ovc(2)*2*cos(ttm/t0*2*pi) ...\n    +ovc(3)*2*cos(ttm/(t0/2)*2*pi));\n  spw=real(ifft(wwt.*fft(pw./spw2)))/wwt(1);\n  \n  %   smooth half wave rectification\n  n2sgram(:,ii) = (spw2(bbase).*(0.25*(log(2*cosh(spw(bbase)*4/1.4))*1.4+spw(bbase)*4)/2))';\n  \n  ist=ist+shiftl;\nend;\nif imgi==1; close(hpg); end; % added 06/Dec./2002% 10/Aug./2005\nif imgi==1; fprintf('\\n'); end;% 10/Aug./2005\n\nnsgram=nsgram.^(1/pc);\nn2sgram=n2sgram.^(2/pc);\n\n%-----------------------------------------------------\n%\tDirty hack for controling time constant in\n%\tunvoiced part analysis\n%-----------------------------------------------------\nif imgi==1; hpg=waitbar(0,'spline-based F0 adaptive smooting'); end;% 10/Aug./2005\nttlv=sum(sum(n2sgram));\nncw=round(2*fs/1000);\n\nlbb=round(300/fs*fftl);  % 22/Sept./1999\n\nh3=(conv(hanning(round(fs/1000)),exp(-1400/fs*(0:ncw*2))));  % 30/July/1999\npwc=fftfilt(h3,abs([xh2, zeros(1,ncw*10)]).^2); % 30/July/1999,   % 08/Sept./1999\nif imgi==1; waitbar(0.1); end; % 08/Dec./2002% 10/Aug./2005\npwc=pwc(round(1:fs/(1000/shiftm):length(pwc)));\n[nn,mm]=size(n2sgram);\npwc=pwc(1:mm);\npwc=pwc/sum(pwc)*sum(sum(n2sgram(lbb:nn,:)));\nif imgi==1; waitbar(0.2); end; % 08/Dec./2002% 10/Aug./2005\n\npwch=fftfilt(h3,abs([xhh, zeros(1,ncw*10)]).^2);% 30/July/1999\nif imgi==1; waitbar(0.3); end; % 08/Dec./2002% 10/Aug./2005\npwch=pwch(round(1:fs/(1000/shiftm):length(pwch)));\n[~,mm]=size(n2sgram);\npwch=pwch(1:mm);\npwch=pwch/sum(pwch)*ttlv;\n\nipwm=7;\t% impact detection window size\nipl=round(ipwm/shiftm);\nww=hanning(ipl*2+1);\nww=ww/sum(ww);\napwt=fftfilt(ww,[pwch(:)' zeros(1,length(ww)*2)]);\napwt=apwt((1:length(pwch))+ipl);\ndpwt=fftfilt(ww,[diff(pwch(:)').^2 zeros(1,length(ww)*2)]);\ndpwt=dpwt((1:length(pwch))+ipl);\nmmaa=max(apwt);\napwt(apwt<=0)=apwt(apwt<=0)*0+mmaa;  % bug fix 03/Sept./1999\nrr=(sqrt(dpwt)./apwt);\nlmbd=(1.0./(1+exp(-(sqrt(rr)-0.75)*20)));\n\npwc=pwc.*lmbd+(1-lmbd).*sum(n2sgram);  %  time constant controller\n\n%\tShaping amplitude envelope\nfor ii=1:mm\n  if f0raw(ii)==0\n    n2sgram(:,ii)=pwc(ii)*n2sgram(:,ii)/sum(n2sgram(:,ii));\n  end;\n  if imgi==1 && rem(ii,10)==0% 10/Aug./2005\n    waitbar(0.4+0.5*ii/mm); % 08/Dec./2002\n  end;\nend;\n\nn2sgram=abs(n2sgram+0.0000000001);\nn2sgram=sqrt(n2sgram);\nif imgi==1; waitbar(1); end; % 08/Dec./2002% 10/Aug./2005\nif imgi==1; fprintf('\\n'); end;\nif imgi==1; close(hpg); end;\n"
  },
  {
    "path": "src/straightCIv1.m",
    "content": "function oki = straightCIv1(actionstr)\n\n%\tSTRAIGHT command interpreter\n\n%       STRAIGHT --- Speech Transformation and Representation using\n%       Adaptive Interpolation of weiGHTed spectrum\n%\tInteractive interface for trial use\n%\n%       (c) Copyright ATR Human Information Processing Research\n%       Laboratories, 1996,1997\n%       Author and Inventor: Hideki Kawahara\n%       02/July/1996\n%       04/July/1996\n%       07/July/1996\n%\t07/Sep./1996\n%\t01/Nov./1996\n%\t25/Nov./1996 TEMPO enhancement\n%\t30/Nov./1996 This version is with AG window trick\n%\t25/Dec./1996 This version is with AG window trick\n%\t27/Dec./1996 using fundamentalness as U/V measure\n%\t02/Feb./1997 without V/UV decision\n%\t05/Feb./1997 Bug Fix\n%\t10/Feb./1997 Maximum liklihood F0 tracking\n%\t15/Feb./1997 frequency range division\n%\t15/Feb./1997 Big bug fix in spectral calculation\n%\t22/Feb./1997 No need for temporal smoothing (thanks for the new window)\n%\t11/Mar./1997 New wavelet for F0 extraction\n%\t03/May /1997 Quick bug fix for Matlab v5\n%\t30/May /1997 Quick bug fix for Matlab v5\n%\t21/June/1997 Quick bug fix for new fundamentalness\n%\t12/Aug./1997 Revised optimum smoother (minor revision)\n%\t13/Aug./1997 Revised SPIKES scaling property and TD enhancement\n%\t19/Dec./1997 Revised for mixed mode excitation\n%\t09/Jan./1998 GUI command line interpreter\n%\t29/Jan./1998 Integrated with mixed mode and GUI\n%\t02/Feb./1998 Minor inconvenience fix\n%\t03/Fev./1998 Minor bug fix\n%\t13/April/1999 New pitch extractor\n%\t19/April/1999 Minor modificatio to display information\n%\t22/April/1999 Minor modificatio for unvoiced spectrum\n%\t05/May  /1999 New periodic/aperiodic mixing ratio\n%\t21/July/1999  reduced version with crisp V/UV decision\n%\t17/Feb./2001 Bug fix for multi channel sound files\n%\t30/May/2001 New aperiodicity measure and control\n%\t8/April/2002 modified to remove magic numbers\n%\t26/June/2002 minor modification: two globals are added.\n%\t08/Dec./2002 Default parameters were made user definable.\n%   04/Feb./2003 Aperiodicity correction and bug fix in STRAIGHTbody proc.\n%   31/Aug./2004 Bug fix for f0 abnormal values\n%\t30/April/2005 modification for Matlab v7.0 compatibility\n\nglobal n2sgram nsgram n3sgram n2sgrambk nwsgram xold x f0floor f0ceil fs framem shiftm f0shiftm ...\n  fftl eta pc framel fftl2 acth pwth pcnv fconv sconv delsp gdbw cornf fname ofname delfracind ...\n  tpath cpath ... %%paraminitialized\n  mag delfrac hr f0raw f0l f0var f0varL sy pcorr pecorr ... %%gobjlist ...\n  upsampleon hhb pwt pwh amp defaultendian indefaultendian outdefaultendian f0varbak\n\nglobal maphandles\n\nglobal bv % 02/Sept./1999\nglobal apv dpv % 21/Sept./1999\nglobal defaultch % 16/Feb./2001\nglobal apve dpve % 22/Oct./2001\n\nglobal f0v vrv % 25/June/2002 for debug\nglobal ecrt % 03/Feb./2003 for C/N based correction of dpv\n\noki = true;\n\nswitch(actionstr)\n  %-----------------------------------------------\n  %\tInitialization part\n  %-----------------------------------------------\n  case 'GUIinitialize'\n    clear global\n    straightCIv1 initializeparams;\n    straightPanel98bak;\n    syncgui;\n    straightCIv1 syncbuttons;\n  case 'resetparamsbtn'\n    straightCIv1 initializeparams;\n    syncgui;\n  case 'initialize'\n    clear global n2sgram nsgram n3sgram n2sgrambk nwsgram xold x f0raw f0l sy hhb\n    straightCIv1 initializeparams;\n    syncgui;\n    straightCIv1 syncbuttons;\n  case 'initializeparams'\n    if exist('defaultparams.m','file')==0 %\t08/Dec./2002\n      f0floor=40;\n      f0ceil=800;\n      fs=22050;\t% sampling frequency (Hz)\n      framem=40;\t% default frame length for pitch extraction (ms)\n      shiftm=1;       % default frame shift (ms) for spectrogram\n      f0shiftm=1;     % default frame shift (ms) for F0 information\n      fftl=1024;\t% default FFT length\n      eta=1.4;        % time window stretch factor\n      pc=0.6;         % exponent for nonlinearity\n      mag=0.2;      % This parameter should be revised.\n      framel=framem*fs/1000;\n      \n      if fftl < framel\n        fftl=2^ceil(log(framel)/log(2));\n      end;\n      fftl2=fftl/2;\n      defaultch=1; % 17/Feb./2001\n      \n      %-------------- Decision parameter for source information\n      \n      acth=0.5;\t% Threshold for normalized correlation (dimension less)\n      pwth=32;\t% Threshold for instantaneous power below maximum (dB)\n      \n      %-----------------------------------------------------\n      %       Synthesis parameters\n      %-----------------------------------------------------\n      \n      pcnv=1.0; \t% pitch stretch\n      fconv=1.0; \t% frequency stretch\n      sconv=1.0; \t% time stretch\n      \n      %\t  delsp=2; \t%  standard deviation of random group delay in ms\n      delsp=0.5; \t%  standard deviation of random group delay in ms 26/June/2002\n      gdbw=70; \t% smoothing window length of random group delay (in Hz)\n      %\t  cornf=3000;  \t% corner frequency for random phase (Hz)\n      cornf=4000;  \t% corner frequency for random phase (Hz) 26/June 2002\n      delfrac=0.2;  % This parameter should be revised.\n      delfracind=0;\n      \n      %-----------------------------------------------------\n      %\tfile parameters\n      %-----------------------------------------------------\n      \n      fname='none';\t\t% input data file name\n      \n      hr='on';\n      tpath=pwd;\n      if strcmp(computer,'MAC2')==0\n        tpath=[tpath '/'];\n      end;\n      upsampleon=0;\n    else %\t08/Dec./2002\n      defaultparams;\n    end; % of if exist('defaultparams.m','file')==0 %\t08/Dec./2002\n    defaultendian=chkdefaultendian;\n    indefaultendian=defaultendian;\n    outdefaultendian=defaultendian;\n  case 'resetvalues'\n    straightCIv1 initializeparams\n    syncgui;\n    \n    %-----------------------------------------------------\n    %\tfile I/O part\n    %-----------------------------------------------------\n  case 'bininputformat'\n    hh=findobj('Tag','bininputformat');\n    indefaultendian=get(hh,'Value');\n  case 'binoutputformat'\n    hh=findobj('Tag','binoutputformat');\n    outdefaultendian=get(hh,'Value');\n  case 'readfile'\n    [fname,cpath]=uigetfile(...\n      {'*.wav';'*.aif';'*.WAV';'*.aiff';'*.dat';'*.dat'},...\n      'sound file input');\n    if fname(1)~=0\n      tcpath=[char(39) cpath char(39)];\n      eval(['cd ' tcpath]);\n      if ~isempty(strfind(lower(fname),'.wav')) % 16/Feb./2001\n        [x,fs]=audioread(fname);\n        x=x*32768;\n      elseif ~isempty(strfind(lower(fname),'.aif')) % 16/Feb./2001\n        [x,fs]=aiffread(fname);\n      else\n        if indefaultendian==1\n          fid=fopen(fname,'r','ieee-le');\n        else\n          fid=fopen(fname,'r','ieee-be');\n        end;\n        x=fread(fid,'short')';\n        fclose(fid);\n      end;\n      [tnn,tmm]=size(x); % 16/Feb./2001\n      if min(tnn,tmm)>1 % 16/Feb./2001\n        switch tnn>tmm\n          case 1,\n            x=x(:,defaultch);\n          case 0,\n            x=x(defaultch,:);\n        end;\n      end;\n      x=x(:)'; % make sure that the vector is row vector\n      xold=x;\n      x=xold+std(x)/1000*randn(size(x));  % 03/Feb./2001\n    else\n      disp('file input is cancelled. ');\n      disp(' ');\n    end;\n    syncgui;\n    straightCIv1 syncbuttons;\n    \n  case 'savefile'\n    tcpath=[char(39) tpath char(39)];\n    eval(['cd ' tcpath]);\n    tsy=sy; tfs=fs;\n    if upsampleon\n      switch fs\n        case {8000, 10000, 11025, 12000}\n          tfs=fs*4; tsy=interp(sy,4);\n        case {16000, 20000, 22050, 24000}\n          tfs=fs*2; tsy=interp(sy,2);\n      end;\n    end;\n    [ofname,tpath]=uiputfile('*','sound file output');\n    if ofname(1)~=0\n      if ~isempty(strfind(ofname,'.wav'))\n        audiowrite([tpath ofname], tsy/32768,tfs);\n      elseif ~isempty(strfind(ofname,'.aif'))\n        ok=aiffwrite(tsy,tfs,16,ofname);\n        if isempty(ok)\n          disp(['File output is failed. ' ofname ' was not written.']);\n        end;\n      else\n        if outdefaultendian==1\n          fid2=fopen([tpath ofname],'w','ieee-le');\n        else\n          fid2=fopen([tpath ofname],'w','ieee-be');\n        end;\n        fwrite(fid2,tsy,'short');\n        fclose(fid2);\n      end;\n      disp(['% Saved successfully as: ' ofname]);\n      disp(' ');\n    else\n      disp('file output is cancelled. ');\n      disp(' ');\n    end;\n    \n    %-----------------------------------------------------\n    %\tDisplay spectrogram group\n    %-----------------------------------------------------\n  case 'dispnsgram'\n    mxil=max(max(20*log10(nsgram+0.001)));\n    [nsy,nsx]=size(nsgram);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2, ...\n      max(20*log10(nsgram+0.001),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['Equal resolution spectrum of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'dispnwsgram'\n    mxil=max(max(20*log10(nwsgram+0.001)));\n    [nsy,nsx]=size(nwsgram);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2, ...\n      max(20*log10(nwsgram+0.001),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['Wide band spectrum of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'dispn2sgram'\n    mxil=max(max(20*log10(n2sgram+0.001)));\n    [nsy,nsx]=size(n2sgram);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2,...\n      max(real(20*log10(n2sgram+0.001)),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['enhanced spectrum of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'dispn2sgrambk'\n    mxil=max(max(20*log10(n2sgrambk+0.001)));\n    [nsy,nsx]=size(n2sgrambk);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2,...\n      max(real(20*log10(n2sgrambk+0.001)),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['Interpolated spectrum of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'dispn3sgram'\n    mxil=max(max(20*log10(n3sgram+0.001)));\n    [nsy,nsx]=size(n3sgram);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2,...\n      max(real(20*log10(n3sgram+0.001)),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['enhanced spectrum (without 2nd strctr) of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'disphhbspectrograme'\n    bb=1:length(n2sgram(1,:));\n    mmx=hhb(:,bb).*n3sgram+(1-hhb(:,bb)).*nwsgram;\n    mxil=max(max(20*log10(mmx+0.001)));\n    [nsy,nsx]=size(mmx);\n    figure;\n    imagesc((0:nsx-1)*shiftm,(0:nsy-1)/nsy*fs/2,...\n      max(real(20*log10(mmx+0.001)),mxil-50));\n    axis('xy'); colormap(1-gray);\n    title(['final composite spectrum of ' fname ' ' date ' ' mktstr]);\n    xlabel('time (ms)');\n    ylabel('frequency (Hz)');\n  case 'showF0'\n    figure(gcf+1); subplot(111);plot((1:length(f0l))*f0shiftm,f0l); grid on;\n    title(['F0 of ' fname ' ' date ' ' mktstr]);\n    ylabel('frequency (Hz)'); xlabel('time (ms)');\n    \n    %-----------------------------------------------\n    %\taudio display part\n    %-----------------------------------------------\n  case 'playoriginal'\n    straightsound(xold,fs);\n  case 'playsynth'\n    straightsound(sy,fs);\n    \n    %-----------------------------------------------\n    %\tparameter modification part\n    %-----------------------------------------------\n  case 'peekvars'  % This is the most poweful interaction\n    keyboard;\n    syncgui;\n    straightCIv1 syncbuttons;\n  case 'getfsmenu'\n    fs=getfsfrommenu(gco);\n    syncgui;\n  case 'editf0ceil'\n    f0ceil=getvalufromedit(gco,800);\n    syncgui;\n  case 'editf0floor'\n    f0floor=getvalufromedit(gco,40);\n    syncgui;\n  case 'editshiftm'\n    f0shiftm=getvalufromedit(gco,1);\n    shiftm=f0shiftm;\n    syncgui;\n  case 'fftledit'\n    syncgui;\n  case 'wndwstrtchedit'\n    eta=getvalufromedit(gco,1.4);\n    syncgui;\n  case 'pwrcnstntedit'\n    pc=getvalufromedit(gco,0.6);\n    syncgui;\n  case 'magfactoredit'\n    mag=getvalufromedit(gco,0.2);\n    syncgui;\n  case 'delfracedit'\n    delfrac=getvalufromedit(gco,0.2);\n    syncgui;\n  case 'delspedit'\n    delsp=getvalufromedit(gco,2);\n    syncgui;\n  case 'cornfedit'\n    cornf=getvalufromedit(gco,2400);\n    syncgui;\n  case 'gdbwedit'\n    gdbw=getvalufromedit(gco,70);\n    syncgui;\n  case 'pcnvedit'\n    pcnv=getvalufromedit(gco,1);\n    syncgui;\n  case 'fconvedit'\n    fconv=getvalufromedit(gco,1);\n    syncgui;\n  case 'sconvedit'\n    sconv=getvalufromedit(gco,1);\n    syncgui;\n  case 'tpathedit'\n    tpath=get(gco,'Value');\n    syncgui;\n  case 'pcnvslider'\n    pcnv=10.0.^get(gco,'Value');\n    syncgui;\n  case 'fconvslider'\n    fconv=3.0.^get(gco,'Value');\n    syncgui;\n  case 'sconvslider'\n    sconv=10.0.^get(gco,'Value');\n    syncgui;\n  case 'delfracradio'\n    delfracind=~delfracind;\n    syncgui;\n  case 'delspradio'\n    delfracind=~delfracind;\n    syncgui;\n  case 'upsamplebtn'\n    upsampleon=~upsampleon;\n    syncgui;\n    \n    %--------------------------------------------------\n    %\tnon-linear manipulations\n    %--------------------------------------------------\n  case 'FqNLbtn'\n    hh=findobj('Tag','FqNLbtn');\n    if get(hh,'UserData') ==0 ||  isempty(get(hh,'UserData'))\n      set(hh,'UserData',1);\n      set(hh,'BackgroundColor',[0.9 0.33333 0.33333]);\n      bendline initialize;\n    else\n      set(hh,'UserData',0);\n      set(hh,'BackgroundColor',[0.733333 0.733333 0.733333]);\n      bendline close;\n    end;\n    \n    %\tThis part is obsolate. This part will be revised completely.\n  case 'interactSGRAM'\n    figure;\n    mxil=max(max(20*log10(n2sgram)));\n    imagesc(max(20*log10(n2sgram),mxil-45));\n    axis('xy'); colormap(1-gray);\n    title(['Interpolated spectrum of ' fname ' ' date ' ' mktstr]);\n    disp('%\tNow you have to define trajectory using mouse');\n    disp('%\tPlease type \"return\", if you are ready.');\n    disp('%\tIt is recommended for you to select important portion ');\n    disp('%\tusing \"zoom on\" command.');\n    disp('%\tPlease do not forget to issue \"zoom off\" before continue.');\n    disp('%\tIn graphical input interaction, click defines point and return');\n    disp('%\tnotifies it is the last point.');\n    keyboard;\n    disp('%\tInteraction started. Put the cursor inside the graphics.');\n    zoom off;\n    getTrace;\n    disp('%\tYou can modify spectrum using the following command.');\n    disp('%       n2sgram=n2sgrambk.*(1+nsgm).^X;');\n    disp('%\t\tX*6 dB amplification is made.');\n    disp('%\t\tDefault 6dB amplification was already done.');\n    disp('%\tIf you are OK, type \"return\". ');\n    disp('%\tOtherwise, please change.');\n    n2sgram=n2sgrambk.*(1+nsgm);\n    \n    %-------------------------------------------\n    %\tmapping control part\n    %-------------------------------------------\n  case 'frequencymapmod'\n    [nii,~]=size(n2sgram);\n    vx=(0:nii-1)/(nii-1);\n    idcv=vx*maphandles(20)+sin(vx*pi)*maphandles(21)+sin(2*pi*vx)*maphandles(22);\n    fconv=max(1,min(nii,idcv*(nii-1)+1));\n    \n    %-------------------------------------------\n    %\tsynthesis part\n    %-------------------------------------------\n  case 'synthesizechar' % This part is useless now\n    disp('%-------- Current Synthesis parameters ------');\n    disp(['%\tdelsp=' num2str(delsp) ...\n      ';     % standard deviation of random group delay in ms']);\n    disp(['%\tgdbw=' num2str(gdbw) ...\n      ';    % smoothing window length of random group delay (in Hz)']);\n    disp(['%\tcornf=' num2str(cornf) ...\n      ';  % corner frequency for random phase (in Hz)']);\n    disp(['%\tpcnv=' num2str(pcnv) ...\n      ';    % pitch stretch']);\n    disp(['%\tfconv=' num2str(fconv) ...\n      ';   % frequency stretch']);\n    disp(['%\tsconv=' num2str(sconv) ...\n      ';   % time stretch']);\n    disp('%\t');\n    disp('%\tIf you are happy with these parameters please type \"return\".');\n    disp('%\tYou can change these setting using Matlab command(s)');\n    disp('%\tIf you want to restore default parameters please type');\n    disp('%\t\"default22kparams\"  There are similar prog. for 12k,16k files.');\n    keyboard;\n    disp('%\tNow, synthesis is in progress. Please wait a moment.');\n    syncgui;\n    straightCIv1 synthesize\n    \n  case 'synthesizegradedqqq'  % OBSOLATE!!!\n    hh=findobj('Tag','FqNLbtn');\n    if ~isempty(hh)\n      if ~isempty(get(hh,'UserData'))\n        if get(hh,'UserData')==1\n          straightCIv1 frequencymapmod\n        end;\n      end;\n    end;\n    sy=straightSynthTC01(n3sgram,nwsgram,f0raw,hhb,shiftm,fs, ...\n      pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind);\n    dBsy=powerchk(sy,fs,15); % 23/Sept./1999\n    cf=(20*log10(32768)-22)-dBsy;\n    sy=sy*(10.0.^(cf/20));\n    disp('%\tDone!');\n    straightCIv1 syncbuttons;\n    \n    \n    \n  case 'synthesizegraded'\n    hh=findobj('Tag','FqNLbtn');\n    if ~isempty(hh)\n      if ~isempty(get(hh,'UserData') )\n        if get(hh,'UserData')==1\n          straightCIv1 frequencymapmod\n        end;\n      end;\n    end;\n    sy=straightSynthTB07ca(n3sgram,f0raw,shiftm,fs, ...\n      pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind, ...\n      aperiodiccomp(apv,dpv,5,f0raw,f0shiftm),1); % 8/April/2002\n    dBsy=powerchk(sy,fs,15); % 23/Sept./1999\n    cf=(20*log10(32768)-22)-dBsy;\n    sy=sy*(10.0.^(cf/20));\n    disp('%\tDone!');\n    straightCIv1 syncbuttons;\n    \n  case 'synthesize'\n    hh=findobj('Tag','FqNLbtn');\n    if ~isempty(hh)\n      if ~isempty(get(hh,'UserData') )\n        if get(hh,'UserData')==1\n          straightCIv1 frequencymapmod\n        end;\n      end;\n    end;\n    sy=straightSynthTB06(n3sgram,f0raw,f0var,f0varL,shiftm,fs, ...\n      pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind);\n    dBsy=powerchk(sy,fs,15); % 23/Sept./1999\n    cf=(20*log10(32768)-22)-dBsy;\n    sy=sy*(10.0.^(cf/20));\n    disp('%\tDone!');\n    straightCIv1 syncbuttons;\n    \n    \n    %------------------------------------------------------\n    %\tanalysis part\n    %\tThis part is modified to introduce a new F0 and\n    %\tsource information extraction method. (19/April/1999)\n    %------------------------------------------------------\n  case 'source'\n    nvo=24;\n    nvc=ceil(log(f0ceil/f0floor)/log(2)*nvo);\n    [f0v,vrv,dfv,~,aav]=fixpF0VexMltpBG4(xold,fs,f0floor,nvc,nvo,1.2,1,shiftm,1,5,0.5,1);\n    title([fname '  ' datestr(now,0)]);\n    %drawnow;\n    [~,~]=size(f0v);\n    subplot(614);\n    [pwt,pwh]=plotcpower(xold,fs,shiftm);drawnow;\n    \n    [f0raw,irms,~,amp]=f0track5(f0v,vrv,dfv,pwt,pwh,aav,shiftm);\n    f0t=f0raw;avf0=mean(f0raw(f0raw>0));\n    f0t(f0t==0)=f0t(f0t==0)*NaN;tt=1:length(f0t);\n    %\t  keyboard;\n    subplot(615);plot(tt*shiftm,f0t,'g');grid on;\n    if ~isnan(avf0)\n      axis([1 max(tt)*shiftm ...\n        min(avf0/sqrt(2),0.95*min(f0raw(f0raw>0)))  ...\n        max(avf0*sqrt(2),1.05*max(f0raw(f0raw>0)))]);\n    end;\n    ylabel('F0 (Hz)');\n    %----------- 31/July/1999\n    hold on;\n    dn=floor(fs/(f0ceil*3*2)); % fix by H.K. at 28/Jan./2003\n    [f0raw,ecr]=refineF06(decimate(xold,dn),fs/dn,f0raw,1024,1.1,3,f0shiftm,1,length(f0raw)); % 31/Aug./2004\n    f0t=f0raw;%%avf0=mean(f0raw(f0raw>0));\n    f0t(f0t==0)=f0t(f0t==0)*NaN;tt=1:length(f0t);\n    subplot(615);plot(tt*shiftm,f0t,'k');hold off;\n    drawnow\n    %----------- 31/July/1999\n    \n    tirms=irms;\n    tirms(f0raw==0)=tirms(f0raw==0)*NaN;\n    tirms(f0raw>0)=-20*log10(tirms(f0raw>0));\n    ecrt=ecr;\n    ecrt(f0raw==0)=ecrt(f0raw==0)*NaN;\n    subplot(616);hrms=plot(tt*shiftm,tirms,'g',tt*shiftm,20*log10(ecrt),'r'); %31/July/1999\n    set(hrms,'LineWidth',2);hold on\n    plot(tt*shiftm,-10*log10(vrv),'k.');\n    grid on;hold off\n    axis([1 max(tt)*shiftm -10 60]);\n    xlabel('time (ms)');ylabel('C/N (dB)');\n    drawnow;\n    irmsz=irms*0;\n    \n    %---------- This part is for maintaining compatibility with old synthesis routine ----\n    f0var=max(0.00001,irms-irmsz).^2;\n    f0var(f0var>0.99)=f0var(f0var>0.99)*0+100;\n    f0var(f0raw==0)=f0var(f0raw==0)*0+100;\n    f0varbak = f0var;  % backup for f0var (18/July/1999)\n    f0var=f0var/2;  %  2 is a magic number. If everything is OK, it should be 1.\n    f0var=(f0var>0.9);  % This modification is to make V/UV decision crisp  (18/July/1999)\n    f0varL=f0var;\n    %-------------------------------------------------------------------------------------\n    f0raw(f0raw<=0)=f0raw(f0raw<=0)*0; % safeguard 31/August/2004\n    f0raw(f0raw>f0ceil)=f0raw(f0raw>f0ceil)*0+f0ceil; % safeguard 31/August/2004\n    \n    straightCIv1 syncbuttons;\n    \n    %--------------------------------------------------------------\n    %\tclassic STRAIGHT with a single V/UV measure\n    %--------------------------------------------------------------\n  case 'straightcore'\n    disp('% Now, adaptive window analysis has started. Please wait a moment.');\n    [n2sgrambk,nsgram]=straightBodyC03ma(xold,fs,shiftm,fftl,f0raw,f0var,f0varL,eta,pc); %%\n    if mag>0\n      n2sgram=specreshape(fs,n2sgrambk,eta,pc,mag,f0raw);\n    else\n      n2sgram=n2sgrambk;\n    end;\n    straightCIv1 syncbuttons;\n    \n    %--------------------------------------------------------------\n    %\trevised STRAIGHT with a multi band graded V/UV decision (OBSOLATE!!)\n    %--------------------------------------------------------------\n  case 'bandcorrbtnqqq'\n    [n2sgrambk,nsgram,nwsgram]= ...\n      straightBodyB04m(xold,fs,shiftm,fftl,f0raw,eta,pc);\n    straightCIv1 syncbuttons;\n    if mag>0\n      n2sgram=specreshape(fs,n2sgrambk,eta,pc,mag,f0raw);\n    else\n      n2sgram=n2sgrambk;\n    end;\n    \n    [pcorr,pecorr]=BcorrMap(xold,fs,f0raw,shiftm);\n    \n    wvm3=wfromMap4(pcorr,pecorr,n2sgram,fs);\n    emap=max(pcorr,pecorr);\n    hh=wvm3'*emap;\n    \n    a=0.32;b=15;c=0.15;   % blending parameter; this is very tentative\n    hhb=max(0,(1.0./(1+exp(-(hh-a)*b))-1.0/(1+exp(-(c-a)*b))) ...\n      /(1.0/(1+exp(-(1-a)*b))-1.0/(1+exp(-(c-a)*b))));\n    straightCIv1 syncbuttons;\n    \n    %-----------------------------------------\n    \n    %   MBE type analysis  2/Sept./1999\n    \n    %-----------------------------------------\n    \n  case 'bandcorrbtn'\n        [n2sgrambk,nsgram]=straightBodyC03ma(xold,fs,shiftm,fftl,f0raw,f0var,f0varL,eta,pc);\n    if mag>0\n      n2sgram=specreshape(fs,n2sgrambk,eta,pc,mag,f0raw);\n    else\n      n2sgram=n2sgrambk;\n    end;\n    \n    [apvq,dpvq,apve,dpve]=aperiodicpartERB2(xold,fs,f0raw,f0shiftm,5,fftl/2+1); % 10/April/2002\n    apv=10*log10(apvq); % for compatibility\n    dpv=10*log10(dpvq); % for compatibility\n    %- ---------\n    %   Notes on aperiodicity estimation: The previous implementation of\n    %   aperiodicity estimation was sensitive to low frequency noise. It is a\n    %   bad news, because environmental noise usually has its power in the low\n    %   frequency region. The following corrction uses the C/N information\n    %   which is the byproduct of fixed point based F0 estimation.\n    %   by H.K. 04/Feb./2003\n    %- ---------\n    dpv=correctdpv(apv,dpv,5,f0raw,ecrt,f0shiftm,fs); % Aperiodicity correction 04/Feb./2003 by H.K.\n    \n    bv=boundmes2(apv,dpv,fs,f0shiftm,5,fftl/2+1);\n    \n    figure;\n    \n    semilogy((0:length(bv)-1)*f0shiftm,0.5./10.0.^(bv));grid on;\n    straightCIv1 syncbuttons;\n    \n  case 'remove2ndstructue'\n    n3sgram=rmv2nd(n2sgram,f0raw,fs);\n    straightCIv1 syncbuttons;\n    \n  case 'bypassbtn'\n    n3sgram=n2sgram;\n    straightCIv1 syncbuttons;\n    \n    %-----------------------------------------------------------------\n    %\tsuppress buttons which are nor appropriate\n    %-----------------------------------------------------------------\n  case 'syncbuttons'\n    hh=findobj('Tag','analyzesrcbtn');\n    if length(xold) >fftl\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','bandcorrbtn');\n    if length(f0raw) >5\n      set(hh,'Enable','on');  % Enabled again 02/Sept./1999\n      \n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','analyzespcbtn');\n    if length(f0raw) >5\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','bypassbtn');\n    if length(n2sgram) >2\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','remove2ndbtn');\n    if length(n2sgram) >2\n      %\t\t  set(hh,'Enable','on');  % commented out at 21/July/1999\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','synthgradbtn');\n    if (length(bv) >2) && (length(n3sgram)>2)\n      set(hh,'Enable','on');  % enabled again at 02/Sept./1999\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','synthesizebtn');\n    if length(n3sgram) >2\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','savetobtn');\n    if length(sy) >fftl\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','adaptivespecbtn');\n    if length(nsgram) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','widespecbtn');\n    if length(nwsgram) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','smoothedspecbtn');\n    if length(n2sgrambk) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','dispn2sgrambtn');\n    if length(n2sgram) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','removedspecbtn');\n    if length(n3sgram) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','cmpstspecgrambtn');\n    if length(hhb) >1\n      %\t\t  set(hh,'Enable','on');  %  commented out on 21/July/1999\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','playorgbtn');\n    if length(xold) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    %----------------------------------------------------\n    hh=findobj('Tag','playsynthbtn');\n    if length(sy) >1\n      set(hh,'Enable','on');\n    else\n      set(hh,'Enable','off');\n    end;\n    \nend;\nend\n\nfunction defaultendian=chkdefaultendian\n%\tdefaultendian\t: 1-littel endian, 2-big endian\n\ngg=computer;\nswitch gg(1:3)\n  case 'PCW'\n    defaultendian=1;\n  case 'MAC'\n    defaultendian=2;\n  case 'SUN'\n    defaultendian=2;\n  case 'SOL'\n    defaultendian=2;\n  case 'HP7'\n    defaultendian=1;\n  case 'SGI'\n    defaultendian=2;\n  case 'ALP'\n    defaultendian=1;\n  case 'AXP'\n    defaultendian=1;\n  case 'LNX'\n    defaultendian=1;\n  otherwise\n    defaultendian=2;\nend;\nend\n\n"
  },
  {
    "path": "src/straightPanel98bak.m",
    "content": "function fig = straightPanel98bak()\n% This is the machine-generated representation of a Handle Graphics object\n% and its children.  Note that handle values may change when these objects\n% are re-created. This may cause problems with any callbacks written to\n% depend on the value of the handle at the time the object was saved.\n%\n% To reopen this object, just type the name of the M-file at the MATLAB\n% prompt. The M-file and its associated MAT-file must be on your path.\n\nload straightpanel98\n\nh0 = figure('Color',[0.8 0.8 0.8], ...\n\t'Colormap',mat0, ...\n\t'Position',[336 165 646 559], ...\n\t'Tag','STRAIGHT control panel v.1');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[309 226 200 292], ...\n\t'Style','frame', ...\n\t'Tag','Frame2');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.65 0.65 0.65], ...\n\t'Position',[313 293 193 37], ...\n\t'Style','frame', ...\n\t'Tag','Frame5');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[309 32 330 189], ...\n\t'Style','frame', ...\n\t'Tag','Frame1');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.8 0.8 0.8], ...\n\t'FontName','Helvetica', ...\n\t'FontSize',18, ...\n\t'Position',[201 528 284 23], ...\n\t'String','STRAIGHT control panel', ...\n\t'Style','text', ...\n\t'Tag','StaticText1');% font size 24->18  03/Sept./1999\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','clear all,close all', ...\n\t'Position',[311 3 329 25], ...\n\t'String','close', ...\n\t'Tag','closebutton');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[516 226 123 291], ...\n\t'Style','frame', ...\n\t'Tag','Frame1');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 peekvars', ...\n\t'Position',[529 439 95 21], ...\n\t'String','peek variables', ...\n\t'Tag','peakbutton');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 dispnsgram', ...\n\t'Enable','off', ...\n\t'Position',[515 173 112 20], ...\n\t'String','adaptive spectrogram', ...\n\t'Tag','adaptivespecbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 dispnwsgram', ...\n\t'Enable','off', ...\n\t'Position',[517 141 111 20], ...\n\t'String','a. wide spectrogram', ...\n\t'Tag','widespecbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 dispn2sgrambk', ...\n\t'Enable','off', ...\n\t'Position',[320 171 159 20], ...\n\t'String','smthd spectrogram', ...\n\t'Tag','smoothedspecbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 dispn3sgram', ...\n\t'Enable','off', ...\n\t'Position',[321 108 158 20], ...\n\t'String','rmvd spectrogram', ...\n\t'Tag','removedspecbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 playsynth', ...\n\t'Enable','off', ...\n\t'Position',[320 45 145 20], ...\n\t'String','Play synthesized', ...\n\t'Tag','playsynthbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 playoriginal', ...\n\t'Enable','off', ...\n\t'Position',[483 44 148 20], ...\n\t'String','Play original', ...\n\t'Tag','playorgbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 savefile', ...\n\t'Enable','off', ...\n\t'Position',[329 236 113 22], ...\n\t'String','save to file', ...\n\t'Tag','savetobtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 synthesize', ...\n\t'Enable','off', ...\n\t'Position',[424 266 80 22], ...\n\t'String','synthesize', ...\n\t'Tag','synthesizebtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 straightcore', ...\n\t'Enable','off', ...\n\t'Position',[424 334 79 22], ...\n\t'String','analyze 1CHX', ...\n\t'Tag','analyzespcbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 source', ...\n\t'Enable','off', ...\n\t'Position',[355 367 113 22], ...\n\t'String','analyze source', ...\n\t'Tag','analyzesrcbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 readfile', ...\n\t'Position',[354 401 113 22], ...\n\t'String','read from file', ...\n\t'Tag','readfilebtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 initialize', ...\n\t'Position',[353 438 113 22], ...\n\t'String','initialize', ...\n\t'Tag','initializebtn');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[5 252 297 268], ...\n\t'Style','frame', ...\n\t'Tag','Frame1');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[160 427 125 20], ...\n\t'String','sampling frequency Hz', ...\n\t'Style','text', ...\n\t'Tag','StaticText2');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.85 0.85 0.85], ...\n\t'Callback','straightCIv1 getfsmenu', ...\n\t'Position',[170 411 108 20], ...\n\t'String',[48000;44100;32000;24000;22050;20000;16000;12500;12000;11050;10000; 8000], ...\n\t'Style','popupmenu', ...\n\t'Tag','samplingfreqmenu', ...\n\t'Value',5);\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[353 483 111 20], ...\n\t'String','Procedures', ...\n\t'Style','text', ...\n\t'Tag','StaticText3');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[431 194 74 20], ...\n\t'String','Display', ...\n\t'Style','text', ...\n\t'Tag','StaticText4');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback',mat2, ...\n\t'Position',[27 459 72 20], ...\n\t'String','800', ...\n\t'Style','edit', ...\n\t'Tag','f0ceiledit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 editf0floor', ...\n\t'Position',[28 411 72 20], ...\n\t'String','40', ...\n\t'Style','edit', ...\n\t'Tag','f0flooredit');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[102 407 32 20], ...\n\t'String','Hz', ...\n\t'Style','text', ...\n\t'Tag','StaticText5');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[101 454 32 20], ...\n\t'String','Hz', ...\n\t'Style','text', ...\n\t'Tag','StaticText5');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[20 431 94 20], ...\n\t'String','F0 lower bound', ...\n\t'Style','text', ...\n\t'Tag','StaticText5');\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[20 483 95 17], ...\n\t'String','F0 higher bound', ...\n\t'Style','text', ...\n\t'Tag','StaticText5');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 remove2ndstructue', ...\n\t'Enable','off', ...\n\t'Position',[425 302 77 20], ...\n\t'String','remove 2nd', ...\n\t'Tag','remove2ndbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 bandcorrbtn', ...\n\t'Enable','off', ...\n\t'Position',[319 334 85 20], ...\n\t'String','analyze MBX', ...\n\t'Tag','bandcorrbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 dispn2sgram', ...\n\t'Enable','off', ...\n\t'Position',[320 139 158 20], ...\n\t'String','enhanced spectrogram', ...\n\t'Tag','dispn2sgrambtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 synthesizegraded', ...\n\t'Enable','off', ...\n\t'Position',[320 266 86 21], ...\n\t'String','synthsize grad', ...\n\t'Tag','synthgradbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 disphhbspectrograme', ...\n\t'Enable','off', ...\n\t'Position',[321 77 158 20], ...\n\t'String','cmpst spectrogram', ...\n\t'Tag','cmpstspecgrambtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[15 293 278 99], ...\n\t'Style','frame', ...\n\t'Tag','Frame3');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[6 4 297 240], ...\n\t'Style','frame', ...\n\t'Tag','Frame4');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[24 366 89 15], ...\n\t'String','FFT lngth', ...\n\t'Style','text', ...\n\t'Tag','StaticText6');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[121 362 75 20], ...\n\t'String','w strtch in t', ...\n\t'Style','text', ...\n\t'Tag','StaticText7');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[210 362 71 20], ...\n\t'String','pwr cnstnt', ...\n\t'Style','text', ...\n\t'Tag','StaticText8');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[36 322 72 20], ...\n\t'String','mag. factor', ...\n\t'Style','text', ...\n\t'Tag','StaticText9');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 fftledit', ...\n\t'Position',[41 347 56 20], ...\n\t'String','1024', ...\n\t'Style','edit', ...\n\t'Tag','fftledit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 wndwstrtchedit', ...\n\t'Position',[128 347 60 20], ...\n\t'String','1.4', ...\n\t'Style','edit', ...\n\t'Tag','wndwstrtchedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 pwrcnstntedit', ...\n\t'Position',[219 346 54 20], ...\n\t'String','0.6', ...\n\t'Style','edit', ...\n\t'Tag','pwrcnstntedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 magfactoredit', ...\n\t'Position',[42 307 56 20], ...\n\t'String','0.2', ...\n\t'Style','edit', ...\n\t'Tag','magfactoredit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 pcnvslider', ...\n\t'Min',-1, ...\n\t'Position',[45 90 186 20], ...\n\t'String','F0 conversion', ...\n\t'Style','slider', ...\n\t'Tag','pcnvslider');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 fconvslider', ...\n\t'Min',-1, ...\n\t'Position',[45 50 187 20], ...\n\t'Style','slider', ...\n\t'Tag','fconvslider');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 sconvslider', ...\n\t'Min',-1, ...\n\t'Position',[44 10 188 20], ...\n\t'Style','slider', ...\n\t'Tag','sconvslider');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 delfracedit', ...\n\t'Position',[153 214 60 20], ...\n\t'String','0.2', ...\n\t'Style','edit', ...\n\t'Tag','delfracedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 pcnvedit', ...\n\t'Position',[236 91 60 20], ...\n\t'String','1', ...\n\t'Style','edit', ...\n\t'Tag','pcnvedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 fconvedit', ...\n\t'Position',[237 50 60 20], ...\n\t'String','1', ...\n\t'Style','edit', ...\n\t'Tag','fconvedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 sconvedit', ...\n\t'Position',[237 11 60 20], ...\n\t'String','1', ...\n\t'Style','edit', ...\n\t'Tag','sconvedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[26 215 122 20], ...\n\t'String','relative tg dispersion', ...\n\t'Style','text', ...\n\t'Tag','StaticText10');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[27 192 121 20], ...\n\t'String','absolute tg dispersion', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 delspedit', ...\n\t'Position',[154 191 60 20], ...\n\t'String','2', ...\n\t'Style','edit', ...\n\t'Tag','delspedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[28 170 121 20], ...\n\t'String','corner frequency', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 cornfedit', ...\n\t'Position',[154 169 60 20], ...\n\t'String','3000', ...\n\t'Style','edit', ...\n\t'Tag','cornfedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[27 148 121 20], ...\n\t'String','tg smoothness', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 gdbwedit', ...\n\t'Position',[154 148 60 20], ...\n\t'String','70', ...\n\t'Style','edit', ...\n\t'Tag','gdbwedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[70 112 121 20], ...\n\t'String','F0 conversion', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[47 70 161 20], ...\n\t'String','frequency axis conversion', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[49 29 156 20], ...\n\t'String','temporal axis conversion', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[221 167 31 20], ...\n\t'String','Hz', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[220 190 35 20], ...\n\t'String','ms', ...\n\t'Style','text', ...\n\t'Tag','StaticText11');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[221 147 31 20], ...\n\t'String','Hz', ...\n\t'Style','text', ...\n\t'Tag','gdbwtxt');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 tpathedit', ...\n\t'Position',[21 259 268 20], ...\n\t'String','hmac117_HD:MATLAB 5:', ...\n\t'Style','edit', ...\n\t'Tag','tpathedit');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 delfracradio', ...\n\t'Position',[251 213 40 20], ...\n\t'Style','radiobutton', ...\n\t'Tag','delfracradio');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 delspradio', ...\n\t'Position',[252 191 42 20], ...\n\t'Style','radiobutton', ...\n\t'Tag','delspradio', ...\n\t'Value',1);\nh1 = uicontrol('Parent',h0, ...\n\t'Position',[145 481 147 20], ...\n\t'String','original sound file', ...\n\t'Style','text', ...\n\t'Tag','StaticText12');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[523 487 111 20], ...\n\t'String','AUX', ...\n\t'Style','text', ...\n\t'Tag','StaticText3');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Position',[144 461 149 20], ...\n\t'String','none', ...\n\t'Style','edit', ...\n\t'Tag','soundfilename');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 bypassbtn', ...\n\t'Enable','off', ...\n\t'Position',[320 302 82 20], ...\n\t'String','bypass', ...\n\t'Tag','bypassbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 upsamplebtn', ...\n\t'Position',[446 237 60 20], ...\n\t'String','up ENBL', ...\n\t'Style','radiobutton', ...\n\t'Tag','upsamplebtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 resetparamsbtn', ...\n\t'Position',[531 243 92 20], ...\n\t'String','reset parameters', ...\n\t'Tag','resetparamsbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'ButtonDownFcn','straightCIv1 F0NLbtn', ...\n\t'Position',[12 91 28 20], ...\n\t'String','NL', ...\n\t'Tag','F0NLbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Callback','straightCIv1 FqNLbtn', ...\n\t'Position',[12 50 28 20], ...\n\t'String','NL', ...\n\t'Tag','FqNLbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'ButtonDownFcn','straightCIv1 txNLbtn', ...\n\t'Position',[11 11 28 20], ...\n\t'String','NL', ...\n\t'Tag','txNLbtn');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[119 322 80 20], ...\n\t'String','frame rate(ms)', ...\n\t'Style','text', ...\n\t'Tag','StaticText13');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[1 1 1], ...\n\t'Callback','straightCIv1 editshiftm', ...\n\t'Position',[129 306 60 20], ...\n\t'Style','edit', ...\n\t'Tag','shiftmedit');\nh1 = uicontrol('Parent',h0, ...\n\t'Callback','straightCIv1 bininputformat', ...\n\t'Position',[532 394 89 20], ...\n\t'String','PC/Alpha (little-endian)|Sun/Mac (big-endian)', ...\n\t'Style','popupmenu', ...\n\t'Tag','bininputformat', ...\n\t'Value',1);\nh1 = uicontrol('Parent',h0, ...\n\t'Callback','straightCIv1 binoutputformat', ...\n\t'Position',[532 351 87 22], ...\n\t'String','PC/Alpha (little-endian)|Sun/Mac (big-endian)', ...\n\t'Style','popupmenu', ...\n\t'Tag','binoutputformat', ...\n\t'Value',1);\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[522 417 108 16], ...\n\t'String','Bin.IN format', ...\n\t'Style','text', ...\n\t'Tag','StaticText14');\nh1 = uicontrol('Parent',h0, ...\n\t'BackgroundColor',[0.733333 0.733333 0.733333], ...\n\t'Position',[522 375 108 17], ...\n\t'String','Bin.OUT format', ...\n\t'Style','text', ...\n\t'Tag','StaticText15');\nif nargout > 0, fig = h0; end\n"
  },
  {
    "path": "src/straightSynthTB06.m",
    "content": "function sy=straightSynthTB06(n2sgram,f0raw,f0var,f0varL,shiftm,fs, ...\n            pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind);\n%    Straight synthesis with all-pass filter design based on\n%\tTEMPO analysis result\n%   sy=straightSynthTB06(n2sgram,f0raw,f0var,f0varL,shiftm,fs, ...\n%               pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind);\n%\tsy\t: synthsized speech\n%\tn2sgram\t: amplitude spectrogram\n%\tf0raw\t: pitch pattern (Hz) \n%\tf0var\t: expected F0 variation with fricative modification\n%\tf0varL\t: expected F0 variation\n%\tshiftm\t: frame shift (ms) for spectrogram\n%\tfs\t: sampling freqnency (Hz)\n%\tpcnv\t: pitch stretch factor\n%\tfconv\t: freqnency stretch factor \n%\tsconv\t: speaking duratin stretch factor\n%\tgdbw\t: finest resolution in group delay (Hz)\n%\tdelfrac\t: ratio of standard deviation of group delay in terms of F0\n%\tdelsp\t: standard deviation of group delay (ms)\n%\tcornf\t: lower corner frequency for phase randomization (Hz)\n%\tdelfracind\t: selector of fixed and proportional group delay\n\n\n%    Straight synthesis with all-pass filter design\n%    by Hideki Kawahara\n%\t(c) ATR Human Info. Proc. Res. Labs. 1996\n%\t07/July/1996\n%\t12/Aug./1996\n%\t22/Aug./1996\n%\t06/Sep./1996 BUG FIX!!! wrong sign\n%\t07/Sep./1996 converted to function script\n%\t09/Sep./1996 coarse F0 information is possible\n%\t16/Sep./1996 tolerant to F0 extraction errors\n%\t02/Nov./1996 Now pitch extraction is perfect. No need for the hack.\n%\t02/Feb./1997 Without V/UV discrimination \n%   08/June/1999 minor bug fix\n\nf0l=f0raw;\n[nii,njj]=size(n2sgram);\nfftl=nii+nii-2;\nfftl2=fftl/2;\nif length(fconv)==1\n    idcv=min([0:fftl/2]/fconv+1,fftl/2+1); % f. stretch conv. tabel\n  elseif length(fconv)==nii\n\tidcv=fconv(:)';\nend;\nsy=zeros([round((njj*shiftm/1000*fs)*sconv+3*fftl+1),1]);\nsyo=sy;\n\nmixVhigh=sqrt(0.25./(f0var+0.25));\nmixNhigh=sqrt(1-0.25./(f0var+0.25));\n\nmixVlow=sqrt(0.25./(f0varL+0.25));\nmixNlow=sqrt(1-0.25./(f0varL+0.25));\n\nphs=fractpitch2(fftl); %  phs will have smooth phase function for unit delay\n\na=([0:fftl2-1,0,-(fftl2-1:-1:1)])/fftl2;\nsz=a'*pi;\nta=[0:fftl2-1]/fftl2/2*2*pi;\nt=[ta,0,-ta(fftl2:-1:2)];\n\nfftl2=fftl/2;\nnsyn=length(sy);\nidx=1;\nbb=1:fftl;\nbb2=1:fftl2;\nrbb2=fftl/2:-1:2;\n\n%------- shaping for low-frequency noize supression\n\nfxa=(0:fftl2)/fftl*fs;\nf0tmp=f0l.*(mixVlow>0.8);\nlowcutf=mean(f0tmp(f0tmp>0))*0.7*pcnv;\n%lowcutfav=mean(f0l(f0l>0))*0.8;\nlowcutfav=lowcutf;\n%wlcutav=1.0./(1+exp(-5*(fxa-lowcutfav)/(lowcutfav/3)));\nwlcutav=1.0./(1+exp(-14*(fxa-lowcutfav)/(lowcutfav/1)));\n%keyboard;\n\n\n%------- parameters for noize based apf design\n\nt=([1:fftl]-fftl/2-1)/fftl*2;\nadjd=1.0./(1+exp(-20*t)); % correction function for smooth transition at fs/2\ngw=exp(-0.25*pi*(fs*(t/2)/gdbw).^2); % slope difinition function\ngw=gw/sum(gw);            % gdbw is the equvalent rectangular band width\nfgw=real(fft(fftshift(gw))); % gw is the spectral smoothing window\ndf=fs/fftl*2*pi;    % normalization constant for integration and differentiation\nfw=(1:fftl2+1)/fftl*fs; % frequency axis\n\ntrbw=300;\t\t% width of transition area\nrho=1.0./(1+exp(-(fw-cornf)/trbw)); % rondom group delay weighting function\n\n[snn,smm]=size(n2sgram);\nfqx=(0:snn-1)/snn*fs/2;\nchigh=1.0./(1+exp(-(fqx-600)/100))';\nclow=1.0-chigh;\n\nf0arc=0;\nlft=1-hanning(fftl);\nlft=1.0./(1+exp(-(lft-0.5)*60));\nww=1.0./(1+exp(-(hanning(fftl)-0.3)*23)); % lifter for\n\niin=1;\ndmx=max(max(n2sgram));\nwhile (idx < nsyn-fftl-10) & (ceil(iin)<length(f0l));\n  \n  iix=idx/fs*1000/shiftm/sconv+1;\n  ii=min(min(max(1,iix),njj),length(f0l));\n%\twlcut=wlcutav;\n    f0=max(40,f0l(round(ii)));\n    f0=f0*pcnv;\n%    wlcut=1.0./(1+exp(-7*(fxa-f0*0.9)/lowcutf));  % 23rd July, 1999\n    wlcut=1.0./(1+exp(-10*(fxa-f0*0.7)/f0));  % 23rd July, 1999\n\n  mix=mixVlow(round(ii))*clow(round(idcv(:)))+mixVhigh(round(ii))*chigh(round(idcv(:)));\n  ff=[n2sgram(round(idcv(:)),round(ii)); ...\n      n2sgram(round(idcv(rbb2)),round(ii))];\n  ff=ff.*[wlcut wlcut(rbb2)]';\n  ccp=real(fft(log(ff+dmx/1000000))); % 24 Sept. 1999  10000 -> 1000000\n  ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n  ffx=(fft(ccp2.*lft)/fftl);\n  nidx=round(idx);\n\n\n%    wlcut=1.0./(1+exp(-20*(fxa-lowcutf)/lowcutf));\n    nf0=fs/f0;\n    frt=idx-nidx;\n    frtz=exp(i*phs*frt)'; % This was in a wrong sign!\n    \n    nz=randn(1,fftl2+1).*((rho*0+1)*mixNlow(round(ii))+(1-mixNlow(round(ii)))*rho);\n    nz=real(ifft(fft([nz,nz(rbb2)]).*fgw));\n    nz=nz*sqrt(fftl*gdbw/fs);   % correction factor for noise\n    if delfracind, delsp=delfrac*1000/f0; end;\n    nz=nz*delsp*df/1000;\n    mz=cumsum([nz(1:fftl2+1),nz(rbb2)])-nz(1);\n    mmz=-(mz-adjd*(rem((mz(fftl)+mz(2)),2*pi)-2*pi));\n    pz=exp(-i*mmz)'; %.*[wlcut wlcut(rbb2)]';\n\n    tx=fftshift(real(ifft(exp(ffx).*pz.*frtz.*[mix;mix(rbb2)]))).*ww;\n%    tx=fftshift(real(ifft(ff.*pz.*frtz.*[mix;mix(rbb2)]))).*ww;\n    sy(bb+nidx)=sy(bb+nidx)+tx*sqrt(nf0);\n%\tif abs(round(ii)-90)<10\n%\t\tkeyboard;\n%\tend;\t\n\n  idx=idx+nf0;\n  iin=min(length(f0l),idx/fs*1000/shiftm/sconv+1);\n  if (mixVlow(round(ii))<0.8) & (mixVlow(round(iin))>0.8)\n    idxo=idx;\n    ipos=min(find(mixVlow(round(ii:iin))>0.8))-1+ii;\n    if length(ipos)==0\n      idx=idxo;\n    else\n      idx=max(idxo-nf0+1,(ipos-1)*fs/1000*shiftm*sconv);\n    end;\n  end;\n%  disp([idx,iin])\nend;\n%sy=sy*0;\nii=1;\nidx=1;\nf0=500;\nf0=1000;\n%wlcutfric=1.0./(1+exp(-14*(fxa-lowcutfav*2)/(lowcutfav)));\nwlcutfric=1.0./(1+exp(-14*(fxa-lowcutfav)/(lowcutfav))); % 31/July/1999\n\nwhile (idx < nsyn-fftl) & (ii<length(f0l));\n  ii=round(min([length(f0l),idx/fs*1000/shiftm/sconv+1,njj]));\n  nidx=round(idx);\n  if mixNhigh(ii)>0.03\n    mix=mixNlow(ii)*clow(round(idcv(:)))+mixNhigh(ii)*chigh(round(idcv(:)));\n    ff=[n2sgram(round(idcv(:)),ii);n2sgram(round(idcv(rbb2)),ii)];\n%    ff=ff.*[wlcut wlcut(rbb2)]';\n    ff=ff.*[wlcutfric wlcutfric(rbb2)]';\n%    ccp=real(fft(log(ff+0.001))); % 23rd July, 1999\n\tccp=real(fft(log(ff+dmx/100000))); % 23rd July, 1999 % 24th Sept. 1999\n    ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n    ffx=(fft(ccp2.*lft)/fftl);\n    nf0=fs/f0;\n\n%============= deleted on 18/July/1999 ======\n%    if f0l(ii) > 0\n%      f0x=lowcutf; % f0l(ii)*pcnv;\n%      f0x=f0l(ii)*pcnv;\n%      wlcut=1.0./(1+exp(-20*(fxa-f0x*0.8)/lowcutf));\n%\t  wlcut=wlcutav;\n%      tx=fftshift(real(ifft(exp(ffx).*[wlcut.*mix' wlcut(rbb2).*mix(rbb2)']')));\n%    else\n%      tx=fftshift(real(ifft(exp(ffx).*[wlcutav.*mix' wlcutav(rbb2).*mix(rbb2)']')));\n%    end;\n\ttx=fftshift(real(ifft(exp(ffx))));\n%============= end of modification on 18/July/1999 ====\n\n    rx=randn([round(nf0),1]);\n    tnx=fftfilt(rx,tx);\n    sy(bb+nidx)=sy(bb+nidx)+tnx(bb).*ww;\n  end;\n  idx=idx+nf0;\n  ii=min(length(f0l),idx/fs*1000/shiftm/sconv+1);\nend;\n\nsy2=sy(fftl/2+(1:round((njj*shiftm/1000*fs)*sconv)));\n\nlowcutf=70;\nif lowcutf <70\n  lowcutf=70;\nend;\n%[b,a]=butter(5,lowcutf/fs*2,'high');\n%sy=filter(b,a,sy2);\nsy=sy2;\n\n\n"
  },
  {
    "path": "src/straightSynthTB07ca.m",
    "content": "function [sy,synthSataus]=straightSynthTB07ca(n2sgram,f0raw,shiftm,fs, ...\n  pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind,ap,imap,imgi,lowestF0)\n%    Straight synthesis with all-pass filter design based on\n%\tTEMPO analysis result\n%   sy=straightSynthTB07ca(n2sgram,f0raw,f0var,f0varL,shiftm,fs, ...\n%               pcnv,fconv,sconv,gdbw,delfrac,delsp,cornf,delfracind,ap,imap,imgi));\n%\tsy\t: synthsized speech\n%\tn2sgram\t: amplitude spectrogram\n%\tf0raw\t: pitch pattern (Hz)\n%\tf0var\t: expected F0 variation with fricative modification\n%\tf0varL\t: expected F0 variation\n%\tshiftm\t: frame shift (ms) for spectrogram\n%\tfs\t: sampling freqnency (Hz)\n%\tpcnv\t: pitch stretch factor\n%\tfconv\t: freqnency stretch factor\n%\tsconv\t: speaking duratin stretch factor (overridden if || imap || >1 )\n%\tgdbw\t: finest resolution in group delay (Hz)\n%\tdelfrac\t: ratio of standard deviation of group delay in terms of F0\n%\tdelsp\t: standard deviation of group delay (ms)\n%\tcornf\t: lower corner frequency for phase randomization (Hz)\n%\tdelfracind\t: selector of fixed and proportional group delay\n%\tap\t: aperiodicity measure\n%\timap\t: arbirtary mapping from new time (sample) to old time (frame)\n%\timgi\t: display indicator, 1: display on (default), 0: off\n%   lowestF0    : lower limit of the resynthesized fundamental frequency (Hz)\n\n%    Straight synthesis with all-pass filter design\n%    by Hideki Kawahara\n%\t(c) ATR Human Info. Proc. Res. Labs. 1996\n%\t07/July/1996\n%\t12/Aug./1996\n%\t22/Aug./1996\n%\t06/Sep./1996 BUG FIX!!! wrong sign\n%\t07/Sep./1996 converted to function script\n%\t09/Sep./1996 coarse F0 information is possible\n%\t16/Sep./1996 tolerant to F0 extraction errors\n%\t02/Nov./1996 Now pitch extraction is perfect. No need for the hack.\n%\t02/Feb./1997 Without V/UV discrimination\n%   08/June/1999 minor bug fix\n\n%\t03/Sep./1999 Graded excitation with one parameter\n%\t29/Nov./1999 Arbitrary time axis mapping\n%\t30/May/2001 revised aperiodicity control\n%\t08/April/2002 revised to remove magical LPF\n%\t11/August/2002 bug fix for V/UV transition\n%\t24/August/2002 more precise F0 control\n% \t23/Sept./2002 minor adjustment for the length of the resynthesized signal\n%\t05/Dec./2002 minor bug fix based on M. Tsuzaki's comment\n%   17/Dec./2002 bug fix in mid point selection\n%\t10/Aug./2005 modified by Takahashi on waitbar\n%\t10/Sept./2005 modified by Kawahara on waitbar\n%   27/Nov./2005 modified by Kawahara for\n%   21/April/2010 bug fix by Hideki Kawahara for aperiodicity\n% 03/July/2016 refactored for MATLAB R2016a and Octave 4.0.2\n\n%if nargin<=14; imgi=1; end; % 10/Sept./2005\nstatusReport = 'ok';% 27/Nov./2005\nswitch nargin % 27/Nov./2005\n  case {1,2,3,4,5,6,7,8,9,10,11,12,13,14}\n    imgi = 1;\n    lowestF0 = 50;\n  case {15}\n    lowestF0 = 50;\nend;\nf0l=f0raw;\n[nii,njj]=size(n2sgram);\nnjj=min([njj,length(f0raw)]);  % 18/Sep./1999\nf0l=f0l(1:njj);  %03/Sep./1999\nif min(f0l(f0l>0))*pcnv < lowestF0\n  statusReport = ['Minimum synthesized F0 exceeded the lower limit(' num2str(lowestF0) ' Hz).'];\nend;\n\nfftLengthForLowestF0 = 2^ceil(log2(2*round(fs/lowestF0)));% 27/Nov./2005\nfftl=nii+nii-2;\nif fftl < fftLengthForLowestF0 % 27/Nov./2005\n  niiNew = fftLengthForLowestF0/2+1;\n  statusReport = 'The FFT length was inconsistent and replaced';\n  n2sgram = interp1(0:nii-1,n2sgram,(0:niiNew-1)*(nii-1)/(niiNew-1));\n  ap = interp1(0:nii-1,ap,(0:niiNew-1)*(nii-1)/(niiNew-1));\n  fftl = fftLengthForLowestF0;\n  nii = niiNew;\nend;\n\n% safeguard for ap mismatch 21/April/2010\nif size(ap,1) ~= size(n2sgram,1)\n  apDouble = zeros(size(n2sgram,1),size(ap,2));\n  for ik = 1:size(ap,2)\n    apDouble(:,ik) = interp1((0:size(ap,1)-1),ap(:,ik),...\n      (0:size(n2sgram,1)-1)/((size(n2sgram,1)-1)/(size(ap,1)-1)),'linear','extrap');\n  end;\n  ap = apDouble;\nend;\n\naprms=10.0.^(ap/20); % 23/Sept./1999\naprm=min(1,max(0.001,aprms*1.6-0.015)); % 30/May/2001\n\nif length(fconv)==1\n  idcv=min((0:fftl/2)/fconv+1,fftl/2+1); % f. stretch conv. tabel\nelseif length(fconv)==nii\n  idcv=fconv(:)';\nelseif length(fconv) ~= nii\n  idcv = 1:fftl/2+1;\n  statusReport = [statusReport '\\n' 'Frequency axix mapping function is not consistent with lowestF0.'];\nend;\nif length(imap)>1\n  sy=zeros(length(imap)+3*fftl,1);disp('here!!');\nelse\n  sy=zeros([round((njj*shiftm/1000*fs)*sconv+3*fftl+1),1]);\n  imap=1:length(sy);\n  imap=min(length(f0l),((imap-1)/fs*1000/shiftm/sconv+1));\nend;\nimap=[imap ones(1,round(fs*0.2))*length(f0l)]; % safe guard\nix=find(imap>=length(f0l), 1, 'first');\nrmap=interp1(imap(1:ix),1:ix,1:length(f0l));\n\nphs=fractpitch2(fftl); %  phs will have smooth phase function for unit delay\n\nfftl2=fftl/2;\nnsyn=length(sy);\nidx=1;\nbb=1:fftl;\nrbb2=fftl/2:-1:2;\n\n%------- parameters for noize based apf design\nt=((1:fftl)-fftl/2-1)/fftl*2;\nadjd=1.0./(1+exp(-20*t)); % correction function for smooth transition at fs/2\ngw=exp(-0.25*pi*(fs*(t/2)/gdbw).^2); % slope difinition function\ngw=gw/sum(gw);            % gdbw is the equvalent rectangular band width\nfgw=real(fft(fftshift(gw))); % gw is the spectral smoothing window\ndf=fs/fftl*2*pi;    % normalization constant for integration and differentiation\nfw=(1:fftl2+1)/fftl*fs; % frequency axis\n\ntrbw=300;\t\t% width of transition area\nrho=1.0./(1+exp(-(fw-cornf)/trbw)); % rondom group delay weighting function\n\n%--------- frozen group delay component calculation ------\nnz=randn(1,fftl2+1).*rho; % This is not effective. Left for randn status.\n%---------\nlft=1-hanning(fftl)+nz(1)*0; % +nz(1)*0 is dummy\nlft=1.0./(1+exp(-(lft-0.5)*60));\nww=1.0./(1+exp(-(hanning(fftl)-0.3)*23)); % lifter for\n\niin=1;\nif imgi==1; hpg=waitbar(0,'voiced part synthesis'); end; % 10/Aug./2005\nicntr=0;\ndmx=max(max(n2sgram));\nwhile (idx < nsyn-fftl-10) && (ceil(iin)<length(f0l));\n  \n  icntr=icntr+1;\n  iix=round(imap(round(idx)));\n  ii=min(min(max(1,iix),njj),length(f0l));\n  if imgi==1 && rem(icntr,10)==0;waitbar(ii/length(f0l));end; % 10/Aug./2005\n  f0=f0l(round(ii));\n  if f0==0\n    f0=200;\n  else\n    f0=max(lowestF0/pcnv,f0l(round(ii))); % 27/Nov./2005\n  end;\n  f0=f0*pcnv;\n  %- --------\n  %\tlook ahead correction of F0 (cmmt by Simon Makin of Sheffield Univ.) 24/Augst/2002\n  %- --------\n  tnf0=fs/f0;\n  tidx=idx+tnf0;\n  tiix=round(imap(round(tidx)));\n  tii=min(min(max(1,tiix),njj),length(f0l));\n  tf0=f0l(round(tii));\n  if (tf0>0) && (f0l(round(ii))>0)\n    if f0l(round((ii+tii)/2))>0  % fix by H.K. on 17/Dec./2002\n      f0=max(lowestF0/pcnv,f0l(round((ii+tii)/2))); % mid point\n    else\n      f0=f0l(round(ii));\n    end;\n    f0=f0*pcnv;\n  end;\n  \n  %- --------\n  ff=[n2sgram(round(idcv(:)),round(ii)); ...\n    n2sgram(round(idcv(rbb2)),round(ii))];\n  ccp=real(fft(log(ff+dmx/1000000)));  % 24 Sept. 1999 10000 -> 1000000\n  ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n  ffx=(fft(ccp2.*lft)/fftl);\n  nidx=round(idx);\n  \n  nf0=fs/f0;\n  frt=idx-nidx;\n  frtz=exp(1i*phs*frt)'; % This was in a wrong sign!\n  \n  nz=randn(1,fftl2+1).*rho; %((rho*0+1)*mixNlow(round(ii))+(1-mixNlow(round(ii)))*rho);\n  nz=real(ifft(fft([nz,nz(rbb2)]).*fgw));\n  nz=nz*sqrt(fftl*gdbw/fs);   % correction factor for noise\n  if delfracind, delsp=delfrac*1000/f0; end;\n  nz=nz*delsp*df/1000;\n  mz=cumsum([nz(1:fftl2+1),nz(rbb2)])-nz(1);\n  mmz=-(mz-adjd*(rem((mz(fftl)+mz(2)),2*pi)-2*pi));\n  pzr=exp(-1i*mmz)'; %.*[wlcut wlcut(rbb2)]'; % set ineffective 01/June/2001\n  \n  pz=pzr; % This makes random group delay to be effective\n  wnz=aprm(round(idcv(:)),round(ii));  % 06/May/2001 This is correct!\n  wpr=sqrt(max(0,1-wnz.*wnz));  % 23/Sept./1999\n  \n  rx=randn(round(nf0),1);\n  %----------- temporal envelope control of the aperiodic component ---\n  zt0=nf0/fs+rx(1)*0; % +rx(1)*0 is a dummy\n  ztc=0.01; % time constant 10ms (for example)\n  ztp=((1:round(nf0))'-1)/fs;\n  nev=sqrt(2*zt0/ztc/(1-exp(-2*zt0/ztc)))*exp(-ztp/ztc);\n  rx=randn(round(nf0),1);\n  wfv=fft((rx-mean(rx)).*nev,fftl); % DC component removal 8/April/2002\n  %--------------------------------------------------------------------\n  \n  ep=0*real(ffx);\n  nf0n=round(nf0);\n  gh=hanning(nf0n*2);\n  ep(1:nf0n)=gh(nf0n:-1:1);\n  ep(end:-1:end-nf0n+2)=ep(2:nf0n); % bug fix on 29/Jan./2003\n  ep=-ep/sum(ep);\n  ep(1)=ep(1)+1;\n  epf=fft(ep);\n  tx=fftshift(real(ifft(epf.*exp(ffx).*pz.*frtz.*[wpr;wpr(rbb2)]))).*ww; % 8/April/2002\n  tx2=fftshift(real(ifft(exp(ffx).*frtz.*[wnz;wnz(rbb2)].*wfv))).*ww; % 31/May/2001\n  sy(bb+nidx)=sy(bb+nidx)+(tx*sqrt(nf0)+tx2)*(f0raw(round(ii))>0); % 02/ Sept./1999\n  idx=idx+nf0;\n  iin=min(max(1,round(imap(round(idx)))),min(njj,length(f0raw))); % modification  on 5/Dec/2002 based on comments by M. Tsuzaki\n  if (f0raw(round(ii))==0) && (f0raw(round(iin))>0) % (mixVlow(round(ii))<0.8) & (mixVlow(round(iin))>0.8)\n    idxo=idx;\n    ipos=find(f0raw(round(ii:iin))>0, 1, 'first')-1+ii;\n    if isempty(ipos)\n      idx=idxo;\n    else\n      idx=max(idxo-nf0+1,rmap(round(ipos))); % 11/August/2002 (Was -1 mistake??)\n    end;\n  end;\nend;\nif imgi==1; close(hpg); end; % 10/Aug./2005\nii=1;\nidx=1;\nf0=1000;\n\nif imgi==1; hpg=waitbar(0,'unvoiced part synthesis'); end; % 10/Aug./2005\nicntr=0;\nwhile (idx < nsyn-fftl) && (ii<length(f0l));\n  icntr=icntr+1;\n  if imgi==1 && rem(icntr,10)==0;waitbar(ii/length(f0l));end;\n  nidx=round(idx);\n  if f0raw(ii) == 0; %mixNhigh(ii)>0.03\n    ff=[n2sgram(round(idcv(:)),ii);n2sgram(round(idcv(rbb2)),ii)];\n    ccp=real(fft(log(ff+dmx/100000))); % 23rd July, 1999 % 24th Sept.\n    ccp2=[ccp(1);2*ccp(2:fftl/2);0*ccp(fftl/2+1:fftl)];\n    ffx=(fft(ccp2.*lft)/fftl);\n    nf0=fs/f0;\n    tx=fftshift(real(ifft(exp(ffx))));\n    rx=randn([round(nf0),1]);\n    tnx=fftfilt(rx-mean(rx),tx); % DC component removal 8/April/2002\n    sy(bb+nidx)=sy(bb+nidx)+tnx(bb).*ww;\n  end;\n  idx=idx+nf0;\n  ii=round(imap(round(idx)));\nend;\nif imgi==1; close(hpg); end; % 10/Aug./2005\nsy2=sy(fftl/2+(1:ix));\nsy=sy2;\nswitch nargout\n  case {1}\n  case {2}\n    synthSataus = statusReport;\nend;\nend\n"
  },
  {
    "path": "src/straightsound.m",
    "content": "function ok=straightsound(x,fs)\n%   Up sampling for reducing aliasing\n%\tRequested by Dr. Uematsu of NTT, 02/02/1998\n\nswitch fs\ncase 8000\n\tsoundsc(interp(x/32768,4),fs*4);\ncase 10000\n\tsoundsc(interp(x/32768,4),fs*4);\ncase 11025\n\tsoundsc(interp(x/32768,4),fs*4);\ncase 12000\n\tsoundsc(interp(x/32768,4),fs*4);\ncase 16000\n\tsoundsc(interp(x/32768,2),fs*2);\ncase 20000\n\tsoundsc(interp(x/32768,2),fs*2);\ncase 22050\n\tsoundsc(interp(x/32768,2),fs*2);\ncase 24000\n\tsoundsc(interp(x/32768,2),fs*2);\notherwise,\n\tsoundsc(x/32768,fs);\nend\nok='ok';\n"
  },
  {
    "path": "src/syncgui.m",
    "content": "function oki=syncgui()\n\n%\tsynchronize GUI and internal values\n\nglobal n2sgram nsgram n3sgram n2sgrambk n3sgramE xold x f0floor f0ceil fs framem shiftm f0shiftm ...\n  fftl eta pc framel fftl2 acth pwth pcnv fconv sconv delsp gdbw cornf fname ofname delfracind ...\n  tpath cpath paraminitialized mag delfrac hr f0raw f0l f0var f0varL sy pcorr pecorr ...\n  upsampleon gobjlist hhb defaultendian  indefaultendian outdefaultendian\n\nframel=round(framem*fs/1000);\nif fftl<framel\n  disp('Warning! fftl is too small.');\n  fftl=2^ceil(log(framel)/log(2) );\n  disp(['New length:' num2str(fftl) ' is used.']);\nend;\n\nhh=findobj('Tag','f0flooredit');\nset(hh,'string',num2str(f0floor));\n\nhh=findobj('Tag','f0ceiledit');\nset(hh,'string',num2str(f0ceil));\n\nhh=findobj('Tag','samplingfreqmenu');\nfsv=[48000 44100 32000 24000 22050 20000 16000 12500 12000 11025 10000 8000];\nset(hh,'Value',max(1,min(11,find(abs(fsv/fs-1)<0.02))))\n\nhh=findobj('Tag','shiftmedit');\nset(hh,'string',num2str(f0shiftm));\n\nhh=findobj('Tag','wndwstrtchedit');\nset(hh,'string',num2str(eta));\n\nhh=findobj('Tag','pwrcnstntedit');\nset(hh,'string',num2str(pc));\n\nhh=findobj('Tag','magfactoredit');\nset(hh,'string',num2str(mag));\n\nhh=findobj('Tag','delfracedit');\nset(hh,'string',num2str(delfrac));\n\nhh=findobj('Tag','delspedit');\nset(hh,'string',num2str(delsp));\n\nhh=findobj('Tag','cornfedit');\nset(hh,'string',num2str(cornf));\n\nhh=findobj('Tag','gdbwedit');\nset(hh,'string',num2str(gdbw));\n\nhh=findobj('Tag','pcnvedit');\nset(hh,'string',num2str(pcnv));\nhh=findobj('Tag','pcnvslider');\nset(hh,'Value',log10(pcnv));\n\nhh=findobj('Tag','fconvedit');\nset(hh,'string',num2str(fconv));\nhh=findobj('Tag','fconvslider');\nset(hh,'Value',log10(fconv)/log10(3));\n\nhh=findobj('Tag','sconvedit');\nset(hh,'string',num2str(sconv));\nhh=findobj('Tag','sconvslider');\nset(hh,'Value',log10(sconv));\n\nhh=findobj('Tag','fftledit');\nset(hh,'string',num2str(fftl));\n\nhh=findobj('Tag','tpathedit');\nset(hh,'string',tpath);\n\nhh=findobj('Tag','delfracradio');\nset(hh,'Value',delfracind);\nhh=findobj('Tag','delspradio');\nset(hh,'Value',~delfracind);\n\nhh=findobj('Tag','upsamplebtn');\nset(hh,'Value',upsampleon);\n\nhh=findobj('Tag','soundfilename');\nset(hh,'string',fname);\n\nhh=findobj('Tag','bininputformat');\nset(hh,'Value',indefaultendian);\n\nhh=findobj('Tag','binoutputformat');\nset(hh,'Value',outdefaultendian);\n\n\noki='ok';\n"
  },
  {
    "path": "src/testBestMix.m",
    "content": "%% Test script for optimum mixing\n% 17/Feb./2016\n% Hideki Kawahara\n\nclear all\nclose all\n\nnSignal = 6;\nbaseValue = 100;\nnData = 10000;\nnIteration = 5000;\n\nstdBest = zeros(nIteration, 1);\nstdMean = zeros(nIteration, 1);\nstdSD = zeros(nIteration, 1);\nfor kk = 1:nIteration\n    sdList = 0.2 + 3 * rand(nSignal, 1);\n    sampleData = randn(nData, nSignal) * diag(sdList) + baseValue;\n    \n    H = ones(nSignal, nSignal) * baseValue^2 * 2;\n    for ii = 1:nSignal\n        H(ii, ii) = H(ii, ii) + 2 * sdList(ii)^2;\n    end;\n    v = ones(nSignal, 1) * 2 * baseValue^2;\n    a = inv(H) * v;\n    stdBest(kk) = std(sampleData * a);\n    stdMean(kk) = std(sampleData  *ones(nSignal, 1) / nSignal);\n    wSD = (1.0 ./ sdList);\n    wSD = wSD / sum(wSD);\n    stdSD(kk) = std(sampleData * wSD);\nend;\nfigure;plot(stdBest, stdMean, '.');grid on;\nhold all\nplot([0 100],[0 100]);\naxis([0 max([stdBest; stdMean]) 0 max([stdBest; stdMean])]);\naxis('square');\nxlabel('optimized SD');\nylabel('SD of simple mean');\nfigure;plot(stdBest, stdSD, '.');grid on;\nhold all\nplot([0 100],[0 100]);\naxis([0 max([stdBest; stdSD]) 0 max([stdBest; stdSD])]);\naxis('square');\nxlabel('optimized SD');\nylabel('SD of 1/SD mixing');\n\n"
  }
]